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