我见过一些可以检测表单是否对用户可见的软件。这可能包括被最小化,另一个屏幕覆盖它,显示器关闭,甚至在远程桌面上时,知道远程桌面视图何时不可见。我猜这与应用程序中是否正在绘制任何内容有关。也许视频驱动程序可以提供这些信息?
我怎样才能让我的应用程序检测到这一点?是否有我可以监控的 Windows 消息?
作为记录,上述软件是一种实时流式传输多个监控摄像头 (RTSP) 的软件,该软件利用这种能力在屏幕不可见时暂停流式传输。
我见过一些可以检测表单是否对用户可见的软件。这可能包括被最小化,另一个屏幕覆盖它,显示器关闭,甚至在远程桌面上时,知道远程桌面视图何时不可见。我猜这与应用程序中是否正在绘制任何内容有关。也许视频驱动程序可以提供这些信息?
我怎样才能让我的应用程序检测到这一点?是否有我可以监控的 Windows 消息?
作为记录,上述软件是一种实时流式传输多个监控摄像头 (RTSP) 的软件,该软件利用这种能力在屏幕不可见时暂停流式传输。
大多数条件没有与之关联的窗口消息,因此您必须手动检测条件。
使用该TForm.WindowState
属性或 Win32 APIIsIconic()
函数来检测窗口的最小化状态。您还可以捕获WM_SYSCOMMAND
寻找SC_MINIMIZE
、SC_MAXIMIZE
和SC_RESTORE
状态的消息。
使用 Win32 APIEnumWindows()
函数循环遍历所有顶层窗口,调用GetWindowRect()
每个窗口,以检测窗口的任何区域是否未被其他窗口覆盖。要考虑 z 顺序,您可能必须使用GetTopWindow()
并GetNextWindow()
迭代 z 顺序以查看哪个窗口位于另一个窗口的顶部。
使用MonitorFromWindow()
和GetDevicePowerState()
检测本地监视器的电源状态。您还可以捕获WM_SYSCOMMAND
寻找SC_MONITORPOWER
通知的消息。
检测远程桌面状态有点棘手。您可以使用ProcessIdToSessionId()
and WTSQuerySessionInformation(WTSIsRemoteSession)
(Windows 7+) 或GetSystemMetrics(SM_REMOTESESSION)
确定您的应用程序是否在远程桌面会话中运行,但我认为您无法检测远程显示器是否打开/关闭(尽管WTSQuerySessionInformation()
可以查询远程显示器的分辨率和颜色深度,即使会话被锁定/解锁)。
我猜这与应用程序中是否正在绘制任何内容有关。
对于部分遮挡的窗口,Canvas.ClipRect
(等于 的rcPaint
成员PAINTSTRUCT
或从中获得的结果GetUpdateRect
)将是设备上下文中必须重绘的部分。GetUpdateRect
可以在处理程序外部调用WM_PAINT
,Canvas.ClipRect
只能在内部调用。
但是,如果您可以仅依靠发送的绘画消息,我不确定。我认为雷米的建议更有说服力。或所有的组合。