Подтвердить что ты не робот

Как мое приложение может найти отправителя сообщения Windows?

У меня есть приложение, которое использует процедуру крючка клавиатуры в библиотеке. WParam в hook для одного сообщения 255, который мы считаем "(зарезервировано/OEMClear)". Я хотел бы разобраться с источником этого сообщения, так как это вызвало сбой приложения в библиотеке, и, учитывая, что это не должно происходить, было бы хорошо его идентифицировать. Сообщение поступает повторно только на одном ПК, который у нас есть, - другие компьютеры вообще не видят сообщение.

Итак, есть ли способ отслеживать источник сообщения, отправленного в окно, или все в системе?

4b9b3361

Ответ 1

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

Однако я бы сказал, что вам действительно не нужна эта информация; вам нужно, чтобы ваше приложение правильно обрабатывало любое отправленное сообщение.

Ответ 2

(Я изначально предлагал использовать Spy ++ или winspector, но они не подключаются к отправке сообщений. Это даже не имеет смысла! Окно принимает сообщения, но они их не отправляют, нить это делает. я оставлю свое предложение об использовании отладчика.)

Иногда может помочь отладка. Попробуйте загрузить файлы PDB и установить точку останова, которая срабатывает только при возникновении одного из этих сообщений. Глядя на стек вызовов в этот момент, можно часто проливать свет на то, почему все происходит. Отправленные сообщения и сообщения, отправляемые от других процессов, будут сорвать этот подход.

Ответ 3

Нет встроенного способа узнать, кто отправил окно сообщения

Конечно, есть. Но это продвинуло программирование Win32 (путем подключения CSRSS)

Ответ 4

Я не уверен, что это делает то, что вы хотите, но посмотрите на Process Monitor sysinternals.

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

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