Обнаружение всплывающих окон Windows - PullRequest
1 голос
/ 22 апреля 2009

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2009

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

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

0 голосов
/ 22 апреля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...