Дескриптор сообщения WM_ACTIVATEAPP НЕ является дескриптором активируемого окна

#.net #winapi #hook

#.net #winapi #перехват

Вопрос:

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

Например, я настроил свое подключение для поиска сообщения WM_ACTIVATEAPP, чтобы узнать, активировано ли одно из моих просматриваемых приложений.

Но когда я смотрю на дескриптор, сопровождающий сообщение, это не дескриптор окна, это какой-то другой дескриптор, который не является частью «дерева» приложения windows. Смотрите это из Spy :

ЗАХВАТ ЭКРАНА SPY

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

Мой вопрос в том, как определить, какое окно / приложение активируется, по дескриптору, переданному в сообщении, и знанию Windows и связанных с ней процессов?

Комментарии:

1. Не уверен, что я полностью понимаю, что вы подразумеваете под «дескриптором сообщения». Однако, согласно документации WM_ACTIVATEAPP , дескриптор окна не включен в его параметры… просто активация или деактивация флага и идентификатор потока .

2. Хорошо, итак, как мне перейти от дескриптора потока к родительскому приложению этого потока?

3.Из форума VB: вам нужно будет перечислить все окна верхнего уровня, а затем получить windowthreadprocessid для каждого из них, чтобы увидеть, какие из них соответствуют вашему PID. link, но также помните WM_ACTVATEAPP , что он отправляется / как активирующим, так и деактивирующим приложениям.

4. WM_ACTIVATE передает дескриптор активируемого / деактивируемого окна.

Ответ №1:

Спасибо всем за их комментарии.

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

Используя WM_ACTIVATEAPP, похоже, что идентификатор потока в сообщении в конечном итоге приводит к возврату к моему приложению, выполняющему подключение, а не к активируемому приложению. Так что это был тупик.

Похоже, это также относится к WM_ACTIVATE. Однако это может быть связано с моей настройкой окна моего приложения в качестве дочернего окна приложения. Не совсем уверен в этом.