【问题标题】:How to find which module is associated with a particular window如何查找与特定窗口关联的模块
【发布时间】:2013-09-06 23:47:30
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: winapi windows-mobile windows-ce


    【解决方案1】:

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

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

    【讨论】:

    • GetWindowLongPtr 没有为 Windows CE 5 / Windows Mobile 6.5 定义。 GetWindowLong(GWL_WNDPROC) 已定义,但它返回的值似乎与模块基地址无关。 CallWindowProc 的文档暗示 GWL_WNDPROC 返回的值可能是“仅对 CallWindowProc 有意义的特殊内部值”,因此不是实际的内存地址。
    • @PaulH 是的,可能是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多