Как найти, какой модуль связан с конкретным окном
У меня есть пользователь, который шалит и звонит SendMessage( HWND_BROADCAST, ... )
и обнаружив, что их применение на этом этапе, естественно, прекращается. В то время как я скажу им прекратить делать это, я также хочу знать, какое окно в системе не отвечает.
Используя EnumWindows()
а также GetWindowThreadProcessId()
Я могу знать HWND, идентификатор процесса и идентификатор потока окна, которое не отвечает. Но этот процесс загружает много библиотек DLL, и любой из них может размещать это окно. Мне нужно выяснить, какой это.
В идеале я бы использовал GetWindowLong( GWL_HINSTANCE )
узнать, что это за модуль, но GWL_HINSTANCE
недоступно на моей платформе Windows CE 5.
Есть ли другой способ получить нужную мне информацию?
Другие способы сформулировать этот вопрос:
- Как я могу узнать, какой HMODULE/HINSTANCE владеет определенным идентификатором потока?
- Как я могу найти, какой HMODULE/HINSTANCE связан с конкретным HWND?
1 ответ
Окна не размещены и не принадлежат модулям. Они принадлежат потокам. Окно связано с потоком, который его создал. Окна могут быть созданы в одном модуле, но имеют оконную процедуру, которая реализована в других модулях.
Тем не менее, возможно, вы можете найти нужную информацию, посмотрев на процедуру окна. Найдите его адрес с помощью вызова GetWindowLongPtr и сравните его со всеми базовыми адресами модуля процесса, которому принадлежит поток, создавший окно.