我有一个顽皮的用户并且正在调用SendMessage( HWND_BROADCAST, ... )
并且发现当时他们的应用程序停止了。虽然我会告诉他们停止这样做,但我也想知道系统中哪个窗口没有响应。
通过使用EnumWindows()
和GetWindowThreadProcessId()
,我能够知道没有响应的窗口的HWND,进程ID和线程ID。但是,该进程是一个加载许多DLL的进程,其中任何一个都可以托管该窗口。我需要找出它是哪一个。
理想情况下,我会使用GetWindowLong( GWL_HINSTANCE )
找出它是哪个模块,但我的Windows CE 5平台上没有GWL_HINSTANCE
。
有没有其他方法可以获得我需要的信息?
用这句话来表达这个问题的其他方式:
答案 0 :(得分:1)
Windows不是由模块托管或拥有的。它们由线程拥有。窗口与创建它的线程相关联。 Windows可以在一个模块中创建,但具有在其他模块中实现的窗口过程。
也就是说,也许你可以通过查看窗口过程找到所需的信息。通过调用GetWindowLongPtr找到它的地址,并将其与拥有创建窗口的线程的进程的所有模块基地址进行比较。