背景
我们正在XenDesktop模式下运行我们的应用程序,我们的窗口显示了一些实时信息。但是,如果在XenDekstop中也启动了其他应用程序,并且该应用程序与我们的窗口重叠,那么我们希望停止渲染。一旦它移出我们的窗口,我们就想重新开始渲染。不幸的是,Citrix目前不支持此类通知。
问题
我们如何检测应用程序窗口的一部分或全部何时被其他窗口重叠,以及何时不再是这种情况?
然而,我在谷歌搜索时发现WindowFromPoint函数家族对我来说并不实用,因为我需要不断轮询窗口覆盖的所有坐标。
奖励积分:首先,如果我能检测到这种重叠何时发生就足够了。然而,如果我能准确地检测到我的窗户的哪个区域被覆盖,那就太好了。
没有这样的API函数。通常不需要它。WM_PAINT关心自己。
如果收到WM_PAINT消息,则会收到一个区域和需要重新绘制的区域的更新矩形。但它只是一个矩形,没有复杂的区域。还有一个裁剪区域。
但应该可以自己计算区域。如果我们谈论的是顶级窗口。
- 创建一个由窗口矩形组成的矩形区域
- 从后向前遍历所有顶层窗口
- 忽略所有窗口,直到找到顶级窗口
- 对于每个可见的顶级窗口,创建一个矩形区域,并将其与当前区域异或
- 使用GetWindow GW_HWNDNEXT应该很容易
生成的区域就是您要搜索的区域。
再次强调:没有这样的函数或消息可以确定、触发或执行,以找到这样的重叠。没有必要提供这样的信息。系统通过适当的WM_PAINT消息来照顾自己。如果某个区域被覆盖。没有必要采取行动。如果某个区域未被覆盖,WM_PAINT将被激发。
我认为在处理WM_PAINT
消息时应该能够获得这种信息,因为通常会相应地设置剪切区域。对RectVisible()
函数的调用应该告诉您,对于窗口的任何部分,它是否"应该被绘制"(因此,它是否刚刚被覆盖(。
尽管这不是OP问题的解决方案,但我想指出的是,一旦重叠的窗口显示出部分窗口(如果您将窗口的更多区域拖回屏幕(,您将在WM_PAINT之前收到WM_ERASEBKGND消息。