我正在开发一个 C# WPF 应用程序,它使用对 Win32 SetParent() 的调用来重新定义另一个应用程序的主窗口。此进程外子窗口的句柄由派生自 HwndHost 的名为 FormHost 的类包装。除了一件事之外,一切都运行良好:reparented 窗口的消息未传递到 FormHost。MSDN 文档明确指出 HwndHost 窗口过程 WndProc() 不能与进程外窗口一起使用。替代方案 MessageHook 也不起作用。我还尝试调用 AttachThreadInput() 来组合两个窗口的输入处理。没运气。有什么建议么?
MK
问问题
1693 次
1 回答
2
重新设置窗口的进程不能直接子类化进程外窗口的消息过程。它必须将自己的窗口过程代码注入到窗口所属进程的地址空间中,在该地址空间中对窗口进行子类化,然后最后根据需要使用您选择的 IPC 机制与重新父进程进行通信。
对于实际注入,您可以:
1) 将实际的窗口过程代码放入 DLL,使用 CreateRemoteThread() 将 DLL 加载到窗口所属进程中,然后让 DLL 的 DllEntryPoint() 子类化窗口(您必须将 HWND 句柄存储在全局内存中的某处所以DLL可以找到它)。
2) 使用 VirtualAllocEx() 和 WriteProcessMemory() 将实际的窗口过程代码放入窗口所属进程的地址空间内分配的内存块中,然后使用 CreateRemoteThread() 使用该内存块执行窗口的实际子类作为窗口过程。
于 2009-09-03T19:52:33.357 回答