1

我有一个顽皮的用户打电话SendMessage( HWND_BROADCAST, ... )来,发现他们的应用程序自然而然地在那个时候停止了。虽然我会告诉他们停止这样做,但我也想知道系统中的哪个窗口没有响应。

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

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

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

表达这个问题的其他方式:

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

1 回答 1

1

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

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

于 2013-09-03T20:22:06.610 回答