Как найти, какой модуль связан с конкретным окном

У меня есть пользователь, который шалит и звонит SendMessage( HWND_BROADCAST, ... ) и обнаружив, что их применение на этом этапе, естественно, прекращается. В то время как я скажу им прекратить делать это, я также хочу знать, какое окно в системе не отвечает.

Используя EnumWindows() а также GetWindowThreadProcessId() Я могу знать HWND, идентификатор процесса и идентификатор потока окна, которое не отвечает. Но этот процесс загружает много библиотек DLL, и любой из них может размещать это окно. Мне нужно выяснить, какой это.

В идеале я бы использовал GetWindowLong( GWL_HINSTANCE ) узнать, что это за модуль, но GWL_HINSTANCE недоступно на моей платформе Windows CE 5.

Есть ли другой способ получить нужную мне информацию?

Другие способы сформулировать этот вопрос:

  • Как я могу узнать, какой HMODULE/HINSTANCE владеет определенным идентификатором потока?
  • Как я могу найти, какой HMODULE/HINSTANCE связан с конкретным HWND?

1 ответ

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

Тем не менее, возможно, вы можете найти нужную информацию, посмотрев на процедуру окна. Найдите его адрес с помощью вызова GetWindowLongPtr и сравните его со всеми базовыми адресами модуля процесса, которому принадлежит поток, создавший окно.

Другие вопросы по тегам