2009-04-22 2 views
1

Я пытаюсь экранировать захват окна. Я проверяю, что я захватываю окно переднего плана, используя GetForegroundWindow(), поэтому теоретически ничего не следует делать поверх окна.Обнаружение Windows Pop Ups

Затем я вызываю GetDC (GetDesktop()) и копирую область экрана, которую мое окно занимает растровое изображение.

Если я вместо этого, вызовите GetDC (myWindowHandle) Я не получаю строку заголовка или границы (или я что-то пропустил?)

Моей проблема заключается в том, что я теперь правильно захватить любое меню, открываемое мое приложение но я также захватываю всплывающие окна (IM-клиент & Tweetdeck), которые нарисованы поверх моего приложения.

Я нашел функцию AnyPopup(), которая возвращает true, когда есть всплывающее окно, но говорит, что это для обратной совместимости с 16-битными версиями окон и, как правило, не полезно. Есть ли простой способ обнаружения всплывающих окон (и их местоположения) или мне нужно перебирать все окна и поочередно перечислять все их дочерние окна, чтобы проверить, находятся ли они поверх моего окна переднего плана?

ответ

0

GetForegroundWindow() возвращает окно, которое в настоящее время принимает пользовательский ввод, оно не обязательно должно быть поверх всех остальных. Окно может быть установлено как «самое верхнее» с помощью функции SetWindowPos(), которая приведет к тому, что он будет включен в другие окна, даже если он не имеет фокуса (я думаю, что это то, что вы подразумеваете под всплывающим окном).

Возможно, вы, возможно, заставите свое окно сделать это сверху, сделав его самым верхним окном, вызывая SetWindowPos() с HWND_TOPMOST в качестве второго параметра. Так как окно имеет фокус ввода, он должен затем располагаться поверх всех самых верхних окон.

Если окно не является вашим собственным окном, вы должны вернуть его в исходное состояние после того, как вы захватили экран. Чтобы узнать, было ли окно самым верхним для начала, вызовите GetWindowLongPtr (myWindowHandle, GWL_EXSTYLE) и посмотрите, был ли установлен стиль WS_EX_TOPMOST.

1

Когда вы вызываете GetDC, вы получаете DC для клиентской области. Чтобы получить DC для всего окна (включая строку заголовка неклиентской области и границу), используйте GetDCEx с флагом DCX_WINDOW.

Кроме того, проверьте функцию PrintWindow, она позволяет сделать снимок окна, даже если его затененный или частично экран - его не идеально, но он работает очень хорошо.