AFAIK, нет встроенной возможности сделать это.
Но давайте сначала исследуем проблему.Вы хотите знать, кто является отправителем сообщения .Однако вы должны знать, что обработка сообщений Windows может быть классифицирована по следующим критериям:
- Отправлено против Отправленных сообщений (
PostMessage
против SendMessage
). - Сообщения, отправленные в окнопринадлежность другому потоку против потока отправителя.
- Сообщения, опубликованные в потоке (не привязаны к конкретному окну, следовательно, не обрабатываются оконной процедурой).
Вы можете непосредственно проследитьотправитель только тогда, когда сообщение отправлено (не отправлено) в окно, тогда как вызов SendMessage
(или аналогичный) был выполнен в потоке, которому принадлежит окно.В таком случае вы увидите отправителя в стеке вызовов.
В случае, если сообщение было отправлено из другого потока, вы не увидите его в стеке вызовов.Просто потому, что стек вызовов показывает цепочку вызовов, которая принадлежит только текущему потоку.Когда сообщение отправляется из другого потока, система выполняет следующее:
- Приостановляет поток вызывающего.
- Помещает это сообщение в очередь потока, которому принадлежит окно.
- Когда этот поток вызывает
GetMessage
(или аналогичный) - сообщение отправляется в окно. - Наконец ОС возобновляет поток вызывающего.
SendMessage
возвращается с результатом, который был возвращен оконной процедурой.
В таком случае вы можете попытаться идентифицировать вызывающего абонента косвенно.Прервите вашу программу точкой останова и попробуйте найти приостановленные потоки, которые заблокированы при вызове по SendMessage
или подобному.
Наконец, отправленные сообщения невозможно отследить вышеуказанным способом.Вы можете попытаться поставить условную точку останова на вызове PostMessage
, но если вызывающий абонент принадлежит к другой проблеме - это будет более сложно.