#.net #winapi #hook
#.net #winapi #перехват
Вопрос:
У меня есть несколько настольных приложений, для которых у меня есть дескрипторы корневого окна. Я настроил перехват, чтобы я мог отслеживать сообщения для этих окон.
Например, я настроил свое подключение для поиска сообщения WM_ACTIVATEAPP, чтобы узнать, активировано ли одно из моих просматриваемых приложений.
Но когда я смотрю на дескриптор, сопровождающий сообщение, это не дескриптор окна, это какой-то другой дескриптор, который не является частью «дерева» приложения windows. Смотрите это из Spy :
Я предполагал, что дескриптор сообщения будет соответствовать дескриптору моего подключенного окна приложения, но это не так.
Мой вопрос в том, как определить, какое окно / приложение активируется, по дескриптору, переданному в сообщении, и знанию Windows и связанных с ней процессов?
Комментарии:
1. Не уверен, что я полностью понимаю, что вы подразумеваете под «дескриптором сообщения». Однако, согласно документации
WM_ACTIVATEAPP
, дескриптор окна не включен в его параметры… просто активация или деактивация флага и идентификатор потока .2. Хорошо, итак, как мне перейти от дескриптора потока к родительскому приложению этого потока?
3.Из форума VB: вам нужно будет перечислить все окна верхнего уровня, а затем получить windowthreadprocessid для каждого из них, чтобы увидеть, какие из них соответствуют вашему PID. link, но также помните
WM_ACTVATEAPP
, что он отправляется / как активирующим, так и деактивирующим приложениям.4. WM_ACTIVATE передает дескриптор активируемого / деактивируемого окна.
Ответ №1:
Спасибо всем за их комментарии.
Похоже, я могу просто выполнить GetForegroundWindow(), чтобы вернуть дескриптор во вновь активированное окно.
Используя WM_ACTIVATEAPP, похоже, что идентификатор потока в сообщении в конечном итоге приводит к возврату к моему приложению, выполняющему подключение, а не к активируемому приложению. Так что это был тупик.
Похоже, это также относится к WM_ACTIVATE. Однако это может быть связано с моей настройкой окна моего приложения в качестве дочернего окна приложения. Не совсем уверен в этом.