检测Windows Pop Ups

时间:2009-04-22 13:52:56

标签: winapi

我正试图抓住一个窗口。我正在检查我是否正在使用GetForegroundWindow()抓住前景窗口,所以从理论上讲,窗口顶部不应该绘制任何东西。

然后我调用GetDC(GetDesktop())并将我的窗口占用的屏幕区域复制到位图。

如果我改为,请致电GetDC(myWindowHandle)我没有得到标题栏或边框(或者我在这里遗漏了什么?)

我的问题是我现在正确地抓住了我的应用程序打开的任何菜单,但我也抓住了通过我的应用程序绘制的弹出窗口(IM客户端和推文)。

我发现函数AnyPopup()在有弹出窗口时返回true但是说这是为了向后兼容16位版本的windows并且通常没用。是否有一种简单的方法来检测弹出窗口(及其位置),或者我是否必须遍历所有窗口并依次枚举所有子窗口以测试它们是否位于我的前景窗口之上?

2 个答案:

答案 0 :(得分:1)

当您致电GetDC时,您将获得客户区的DC。要获取整个窗口的DC(包括非客户区标题栏和边框),请使用带有DCX_WINDOW标志的GetDCEx

另外,看看PrintWindow功能,它可以让你拍摄一个窗口的快照,即使它被遮挡或部分关闭 - 它不是很完美,但效果很好。

答案 1 :(得分:0)

GetForegroundWindow()返回当前接收用户输入的窗口,它不一定需要在所有其他窗口之上。可以使用SetWindowPos()函数将窗口设置为“最顶层”,即使它没有焦点,也会导致它在其他窗口的顶部(我认为这就是弹出窗口的意思)。

你可以通过调用带有HWND_TOPMOST的SetWindowPos()作为第二个参数来强制你的窗口成为最顶层的窗口。由于窗口具有输入焦点,因此它应该最终位于所有最顶层的窗口之上。

如果窗口不是您自己的窗口,则必须确保在进行屏幕抓取后将其恢复到原始状态。要确定窗口是否是最开始的窗口,请调用GetWindowLongPtr(myWindowHandle,GWL_EXSTYLE)并查看是否设置了WS_EX_TOPMOST样式。