Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理来自其他进程的窗口消息_C#_Windows_Messages_Reparenting - Fatal编程技术网

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

C# 处理来自其他进程的窗口消息,c#,windows,messages,reparenting,C#,Windows,Messages,Reparenting,我正在开发一个C#WPF应用程序,它使用对Win32 SetParent()的调用来重新分配另一个应用程序的主窗口。此进程外子窗口的句柄由一个名为FormHost的类包装,该类派生自HwndHost。除了一件事之外,一切都很好:重新租用窗口的消息没有传递到FormHost。MSDN文档明确指出,HwndHost窗口过程WndProc()不能与进程外窗口一起使用。或者,MessageHook也不起作用。我还尝试调用AttachThreadInput()来组合两个窗口的输入处理。不走运。有什么建议吗

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

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

对于实际注射,您可以:

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


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

向上投票-回答不错。但是,当DEP打开时,选项2是否可以在windows vista及以上版本上工作?nvm-VirtualProtectEx还允许设置内存保护。