3

背景

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

问题

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

我在谷歌搜索时发现了WindowFromPoint系列函数,但是,这对我的目的不实用,因为我需要继续轮询我的窗口覆盖的所有坐标。

加分点:首先,如果我能检测到何时发生这种重叠就足够了。但是,如果我可以准确地检测到我的窗口的哪些区域被覆盖,那就太好了。

4

3 回答 3

3

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

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

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

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

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

再说一遍:没有这样的函数或消息可以确定、触发或执行以找到这样的重叠。不需要这样的信息。系统使用适当的 WM_PAINT 消息来照顾自己。如果一个区域被覆盖。没有必要采取行动。如果一个区域未被发现,WM_PAINT 就会被触发。

于 2015-09-23T09:13:16.623 回答
2

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

于 2015-09-23T08:37:39.047 回答
0

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

于 2021-07-19T09:13:35.897 回答