2009-04-22 62 views
1

我試圖屏幕抓取一個窗口。我正在檢查使用GetForegroundWindow()來抓取前景窗口,因此從理論上講,窗口頂部不應該繪製任何東西。檢測Windows Pop Ups

然後我調用GetDC(GetDesktop())並將我的窗口占用的屏幕區域複製到位圖。

如果我不是,調用的GetDC(myWindowHandle)我不明白的標題欄或邊框(還是我失去了一些東西?)

我的問題是,我現在正確搶我的應用程序打開任何菜單但我也會抓取通過我的應用程序繪製的彈出窗口(IM客戶端& Tweetdeck)。

我找到了函數AnyPopup(),它在有彈出窗口時返回true,但表示這是爲了向後兼容16位版本的Windows並且通常沒有用。是否有一種檢測彈出窗口(及其位置)的簡單方法,還是必須依次遍歷所有窗口並依次枚舉它們的所有子窗口,以測試它們是否位於我的前景窗口之上?

回答

0

GetForegroundWindow()返回當前接收用戶輸入的窗口,它不一定需要在所有其他窗口之上。使用SetWindowPos()函數可以將窗口設置爲「最頂層」,即使它沒有焦點(我認爲這就是您彈出窗口的含義),它將使其成爲其他窗口的頂層。

通過調用SetWindowPos()作爲第二個參數HWND_TOPMOST,您也許可以強制您的窗口成爲頂層窗口。由於該窗口具有輸入焦點,因此它應該最終位於所有最頂層的窗口之上。

如果窗口不是您自己的窗口,您必須確保在您執行屏幕抓取後將其恢復到原始狀態。要確定該窗口是否最開始,請調用GetWindowLongPtr(myWindowHandle,GWL_EXSTYLE)並查看是否設置了WS_EX_TOPMOST樣式。

1

當你調用GetDC時,你得到客戶區的DC。要獲得整個窗口的DC(包括非客戶區域標題欄和邊框),請使用帶有DCX_WINDOW標誌的GetDCEx

此外,請查看PrintWindow函數,它可以讓您拍攝一個窗口的快照,即使它的模糊或部分關閉屏幕 - 它不完美,但它工作得很好。