处理来自其他进程的窗口消息

时间:2009-09-01 19:13:31

标签: c# windows messages reparenting

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

1 个答案:

答案 0 :(得分:2)

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

对于实际注射,您可以:

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

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