如何知道我的申请是否可见?

时间:2013-11-07 01:24:21

标签: delphi drawing visibility

我见过一些可以检测表单是否对用户可见的软件。这可能包括最小化,另一个屏幕覆盖,监视器关闭,甚至在远程桌面上,知道远程桌面视图何时不可见。我猜它与是否在应用程序中绘制任何内容有关。也许视频驱动程序可以提供此信息?

如何让我的应用程序检测到这个?是否有可以监控的Windows消息?

为了记录,所提到的软件是一个实时流式传输多个监控摄像头的软件(RTSP),它利用这种能力在屏幕不可见时暂停流媒体的优势。

2 个答案:

答案 0 :(得分:6)

大多数条件都没有与之关联的窗口消息,因此您必须手动检测条件。

使用TForm.WindowState属性或Win32 API IsIconic()函数来检测窗口的最小化状态。您还可以抓取WM_SYSCOMMAND条消息,查找SC_MINIMIZESC_MAXIMIZESC_RESTORE州。

使用Win32 API EnumWindows()函数遍历所有顶级窗口,在每个窗口上调用GetWindowRect(),以检测窗口的任何区域是否未被其他窗口覆盖。要考虑z排序,您可能必须使用GetTopWindow()GetNextWindow()来迭代z顺序,以查看哪个窗口位于另一个窗口的顶部。

使用MonitorFromWindow()GetDevicePowerState()检测本地监视器的电源状态。您还可以抓取WM_SYSCOMMAND条消息,查找SC_MONITORPOWER通知。

检测远程桌面状态有点棘手。您可以使用ProcessIdToSessionId()WTSQuerySessionInformation(WTSIsRemoteSession)(Windows 7+)或GetSystemMetrics(SM_REMOTESESSION)来确定您的应用是否在远程桌面会话中运行,但我认为您无法检测到远程显示开启/关闭(尽管WTSQuerySessionInformation()可以查询远程显示器的分辨率和颜色深度,即使会话被锁定/解锁)。

答案 1 :(得分:2)

  

我猜它与是否在应用程序中绘制任何内容有关。

对于部分遮挡的窗口,Canvas.ClipRect(等于PAINTSTRUCTrcPaint成员或从GetUpdateRect获得的结果)将成为设备上下文的一部分必须重新绘制。 GetUpdateRect可以在WM_PAINT处理程序之外调用,Canvas.ClipRect仅在。{/ p>内

但如果你可以完全依赖发送的彩信,我不确定。我认为Remy's suggestions更强大。或者是所有的组合。