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

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

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


person mj2008    schedule 26.05.2009    source источник
comment
Окончательным решением для этого, к сожалению, стал лейкопластырь. Я добавил еще один хук в свое приложение, которое ищет это значение wParam и не вызывает цепочку хуков в случае совпадения. Я делаю его специфичным для ПК (реестр), но, похоже, с этим ПК что-то не так.   -  person mj2008    schedule 10.06.2009


Ответы (3)


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

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

person Ana Betts    schedule 26.05.2009
comment
Я наполовину согласен - наша цель здесь - найти причину, тогда мы сможем оценить серьезность и справиться с ней соответствующим образом. Я не хочу просто наклеивать на него пластырь на случай, если он потом укусит, тем более что это коммерческая библиотека, в которой ошибка не работает. - person mj2008; 26.05.2009
comment
@ mj2008: Если вы развертываете это на машинах, которые вы не полностью контролируете, вас укусят; многие плохо написанные приложения отправляют странные сообщения во все окна, пытаясь что-то сделать, и вам приходится справляться с этим элегантно. Просто захватите интересующие вас сообщения и передайте остальные следующему хуку в цепочке. - person Ana Betts; 26.05.2009
comment
Я предлагаю добавить идентификатор отправителя в сообщение. - person Alpay; 10.01.2013

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

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

person Aardvark    schedule 26.05.2009
comment
Сначала я посмотрел на Wspector (использовал его годами), но он не показывает источник. Отладчик может быть единственным выбором... - person mj2008; 26.05.2009

Я не уверен, что это делает то, что вы хотите, но взгляните на Process Monitor от sysinternals.

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

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

person Ozzy    schedule 26.05.2009
comment
Спасибо - кажется, сообщения не отслеживаются, но это привело меня к msdn. microsoft.com/en-us/library/cc267862.aspx, где подробно описаны параметры отладки в отладочной сборке. Но и для отслеживания сообщений тоже ничего! - person mj2008; 26.05.2009
comment
Я не вижу сообщения Windows как «операцию» в Process Monitor. - person Aardvark; 26.05.2009
comment
Process Monitor не отслеживает объекты USER (например, окна ). - person IInspectable; 27.06.2019