【问题标题】:Detect when window gets overlapped by another window from the same or different process检测窗口何时与来自相同或不同进程的另一个窗口重叠
【发布时间】:2015-09-23 08:16:19
【问题描述】:

背景

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

问题

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

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

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

【问题讨论】:

  • 在 WM_ACTIVATE 之外没有任何通知。手动实现 WS_EX_TOPMOST 样式不是很实用。要求你的窗户永远不能被遮盖是不太实际的。
  • 为什么需要这个?你想达到什么目的?
  • @MichaelWalz,我们在 XenDesktop 模式下运行我们的应用程序,我们的窗口显示了一些实时信息。但是,如果在 XenDekstop 中也启动了其他应用程序并且该应用程序与我们的窗口重叠,那么我们希望停止渲染。一旦它移出我们的窗口,我们就想再次开始渲染。遗憾的是,Citrix 目前不支持此类通知。
  • @IshanRastogi 您应该将此信息放在您的问题中。

标签: c++ winapi citrix xendesktop


【解决方案1】:

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

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

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

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

结果区域就是您要搜索的区域。

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

【讨论】:

  • 感谢@xMRi。我正在考虑采用这种方法,每 300 毫秒左右使用重复轮询。我认为在我删除之前渲染仍然会在顶部可见,但希望这不会是一个大的用户体验问题。要检查的另一件事是性能,但希望那里也不会受到太大影响,因为它主要是数学计算。如果您有任何其他想法,请告诉我。非常感谢您的帮助!
【解决方案2】:

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

【讨论】:

  • 感谢您的提示,但不幸的是,当另一个窗口被带到前面或移开时,似乎不会调用 WM_PAINT。我想我必须采用 xMRi 描述的方法,尽管我必须反复轮询。
  • 应该是当另一个窗口被移开时,但 Citrix 可能会搞砸。
  • @medinoc 如果拉开覆盖窗口 1/4 角的窗口,则该区域将添加到更新区域。如果应用程序自上次绘制以来没有更改,是否不需要重新绘制它,由于 DWM,并且如果选择了整个客户区域,它仍然会被更新并且是剪辑区域的一部分,并且以前更新/验证,因为它只是一个 1/4 角。应用程序通常会检查这个还是总是重绘?
  • @LewisKelsey 我不能说,我没有研究过 DWM 的效果。对不起。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多