【问题标题】:Handling messages for window from other process处理来自其他进程的窗口消息
【发布时间】:2010-11-24 17:59:43
【问题描述】:

我正在开发一个 C# WPF 应用程序,它使用对 Win32 SetParent() 的调用来重新设置另一个应用程序的主窗口。这个进程外子窗口的句柄由派生自 HwndHost 的名为 FormHost 的类包装。除了一件事之外,一切都运行良好:reparented 窗口的消息未传递到 FormHost。 MSDN 文档明确指出 HwndHost 窗口过程 WndProc() 不能与进程外窗口一起使用。替代方案 MessageHook 也不起作用。我还尝试调用 AttachThreadInput() 来组合两个窗口的输入处理。没有运气。有什么建议?

【问题讨论】:

    标签: c# windows messages reparenting


    【解决方案1】:

    重新设置窗口的进程不能直接子类化进程外窗口的消息过程。它必须将自己的窗口过程代码注入到窗口所属进程的地址空间中,在该地址空间中对窗口进行子类化,然后最后根据需要使用您选择的 IPC 机制与重新父进程进行通信。

    对于实际的注入,您可以:

    1) 将实际的窗口过程代码放入 DLL,使用 CreateRemoteThread() 将 DLL 加载到窗口所属进程中,然后让 DLL 的 DllEntryPoint() 子类化窗口(您必须将 HWND 句柄存储在全局内存,以便 DLL 可以找到它)。

    2) 使用 VirtualAllocEx() 和 WriteProcessMemory() 将实际的窗口过程代码放入窗口所属进程的地址空间内分配的一块内存中,然后使用 CreateRemoteThread() 执行窗口的实际子类该内存块作为窗口过程。

    【讨论】:

    • 赞成 - 不错的答案。但是,当 DEP 开启时,选项 2 会在 windows vista 及更高版本上工作吗?
    • nvm - VirtualProtectEx 也允许设置内存保护。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-01-11
    相关资源
    最近更新 更多