如何查找与特定窗口关联的模块

时间:2013-09-03 16:43:09

标签: winapi windows-mobile windows-ce

我有一个顽皮的用户并且正在调用SendMessage( HWND_BROADCAST, ... )并且发现当时他们的应用程序停止了。虽然我会告诉他们停止这样做,但我也想知道系统中哪个窗口没有响应。

通过使用EnumWindows()GetWindowThreadProcessId(),我能够知道没有响应的窗口的HWND,进程ID和线程ID。但是,该进程是一个加载许多DLL的进程,其中任何一个都可以托管该窗口。我需要找出它是哪一个。

理想情况下,我会使用GetWindowLong( GWL_HINSTANCE )找出它是哪个模块,但我的Windows CE 5平台上没有GWL_HINSTANCE

有没有其他方法可以获得我需要的信息?

用这句话来表达这个问题的其他方式:

  • 如何找到哪个HMODULE / HINSTANCE拥有特定的线程ID?
  • 如何找到与特定HWND关联的HMODULE / HINSTANCE?

1 个答案:

答案 0 :(得分:1)

Windows不是由模块托管或拥有的。它们由线程拥有。窗口与创建它的线程相关联。 Windows可以在一个模块中创建,但具有在其他模块中实现的窗口过程。

也就是说,也许你可以通过查看窗口过程找到所需的信息。通过调用GetWindowLongPtr找到它的地址,并将其与拥有创建窗口的线程的进程的所有模块基地址进行比较。