检测窗口何时被来自相同或不同进程的另一个窗口重叠

时间:2015-09-23 08:16:20

标签: c++ winapi citrix xendesktop

背景

我们正在XenDesktop模式下运行我们的应用程序,我们的窗口显示了一些实时信息。但是如果在XenDekstop中也启动了一些其他应用程序,并且该应用程序与我们的窗口重叠,那么我们想要停止渲染。一旦它移出窗口,我们就想再次开始渲染。不幸的是,目前Citrix不支持这类通知。

问题

我们如何检测应用程序窗口的一部分或全部何时与其他窗口重叠,并检测何时不再是这种情况?

我在谷歌搜索时找到了WindowFromPoint系列函数,然而,这对我的目的来说并不实用,因为我需要继续轮询我的窗口所涵盖的所有坐标。

奖励积分:首先,如果我能够检测到何时发生这种重叠,那就足够了。但是,如果我能够确切地检测到我的窗户的哪个区域被覆盖,那就太棒了。

3 个答案:

答案 0 :(得分:3)

没有这样的API函数。而且通常不需要它。 WM_PAINT关心自己。

如果收到WM_PAINT消息,则会收到需要重新绘制区域的区域和更新矩形。但它只是一个矩形,没有复杂的区域。还有一个裁剪区域。

但应该可以自己计算区域。如果我们谈论的是顶级窗口。

  • 创建一个由窗口
  • 组成的矩形区域
  • 从后到前走所有顶层窗户
  • 忽略所有窗口,直至找到顶级窗口
  • 对于每个可见的顶级窗口,创建一个矩形区域,并将其与当前区域进行异或。
  • GetWindow GW_HWNDNEXT
  • 应该很容易

生成的区域就是您要搜索的区域。

再次:没有这样的函数或消息确定,被触发或可以被执行以找到这样的重叠。不需要这样的信息。系统通过适当的WM_PAINT消息来关心自己。如果一个区域被覆盖。没有必要采取行动。如果某个区域被揭开,WM_PAINT将被触发。

答案 1 :(得分:1)

我认为您在处理WM_PAINT消息时应该能够获得此类信息,因为通常会相应地设置剪切区域。对RectVisible()函数的调用应该告诉您,对于窗口的任何部分,它是否“应该被绘制”(以及是否刚刚被覆盖)。

答案 2 :(得分:0)

尽管这不是 OP 问题的解决方案,但我想指出的是,一旦重叠窗口显示您的窗口的一部分(并且如果您将窗口的更多区域拖回屏幕),您将收到一条 WM_ERASEBKGND 消息在 WM_PAINT 之前。