2009-09-01 22 views
1

私はWin32 SetParent()の呼び出しを使って別のアプリケーションのメインウィンドウを再作成するC#WPFアプリケーションを開発しています。このアウトオブプロセスの子ウィンドウへのハンドルは、HwndHostから派生したFormHostという名前のクラスによってラップされます。 1つのことを除いて、すべて正常に機能しています。元のウィンドウのメッセージはFormHostには配信されません。 MSDNのドキュメントには、HwndHostウィンドウプロシージャWndProc()をアウトプロセスウィンドウで使用できないことが明確に記載されています。代わりに、MessageHookも動作しません。私はAttachThreadInput()を呼び出して、2つのウィンドウの入力処理を結合することも試みました。運がない。助言がありますか?他のプロセスからのウィンドウのメッセージの処理

答えて

2

ウィンドウを元に戻すプロセスは、アウトオブプロセスウィンドウのメッセージプロシージャを直接サブクラス化できません。ウィンドウの所有プロセスのアドレス空間に独自のウィンドウプロシージャコードを注入し、そのアドレス空間内のウィンドウをサブクラス化し、最後に必要に応じて再作成プロセスに通信するために選択したIPCメカニズムを使用する必要があります。実際の注射のために

、次のいずれかを実行します

1)DLLに実際のウィンドウプロシージャのコードを入れて、ウィンドウの所有プロセスにDLLをロードした後、DLLのDllEntryPointを持ってCreateRemoteThread()を使用します( )ウィンドウをサブクラス化します(HWNDハンドルをグローバルメモリに格納して、DLLが見つけられるようにする必要があります)。

2)VirtualAllocEx()とWriteProcessMemory()を使用して、ウィンドウの所有プロセスのアドレス空間内に割り当てられたメモリブロックに実際のウィンドウプロシージャコードを入れてから、CreateRemoteThread()を使用してウィンドウの実際のサブクラスを実行するそのメモリブロックをウィンドウプロシージャとして使用します。

+0

upvoted - いい答え。ただし、DEPがオンになっている場合、オプション2はWindows Vista以上で動作しますか? – quixver

+0

nvm - VirtualProtectExではメモリ保護も設定できます。 – quixver

関連する問題