1

別のアプリケーションと連携する必要がある WPF アプリケーションがあります。

このアプリケーションには、約 20 個のカスタム Windows メッセージ (WM_USER+50...WM_USER+70) があります。

私が達成しようとしていることの要約:

WPF アプリケーション -> SendMessage -> サードパーティ アプリケーション

私が抱えている問題は、すべてのメッセージがカスタム メッセージであることです。したがって、独自のデータ マーシャリングを実装する必要があります。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspxを参照してください。

私が経験する必要があるプロセスは次のとおりです。

  1. プロセスを取得し、すべてのアクセスに対して開きます。User32.GetWindowThreadProcessId(windowHandle, out pId);

    // すべてのアクセスでプロセスを開く
    someprocess = OpenProcess((0x1F0FFF), false, (int)pId);

  2. プロセスにバッファを割り当てます: IntPtr buffer = VirtualAllocEx( hProcess, IntPtr.Zero, 1024, 0x1000, 0x04 );

  3. #2で作成されたバッファに書き込まれるある種の構造体を埋めますか?

  4. #3 をリモート バッファにコピーするのは #2 ですか? WriteProcessMemory??

  5. カスタム メッセージを送信します ( SendMessage(windowhandle, customMsg, 0, buffer from #2?)

  6. リモート プロセス バッファからローカル バッファに構造体を読み込みます。

  7. このデータをマネージド型にマーシャリングします。(これは C# .Net アプリケーションです)

私は本当にいくつかの洞察を使うことができました。私はこれまであまり運がありませんでした。私が最もこだわっている部分は、どのタイプの構造体を WriteProcessMemory に送信するかということだと思いますか?

4

2 に答える 2

3

WM_COPYDATA間違いなくこれを行う最も簡単な方法です。WM_COPYDATADWORD 値と任意のサイズのデータ​​ チャンクの 2 つの異なるデータ項目を別のプロセスに送信できます。したがって、実装では、おそらく次のようにするでしょう。

COPYDATASTRUCT cds;
cds.dwData = WM_USER + 50; // the "message" you want to send
cds.cbData = sizeof(MyDataForMessage50); // the size of the chunk of data
cds.lpData = lpMessage50Data; // a pointer to the chunk of data
SendMessage(hwndTarget, WM_COPYDATA, reinterpret_cast<WPARAM>(hwndSender),
            reinterpret_cast<LPARAM>(&cds));

hwndTargetは他のプロセスのターゲット ウィンドウでありhwndSender送信プロセスのウィンドウであることに注意してください。ターゲット ウィンドウは同じパラメーターを受け取るためwParam、メッセージの送信者を知るために使用できるため、必要に応じて返信を送信できます。

受信側の WndProc で:

if (uMsg == WM_COPYDATA)
{
    HWND hwndSender = reinterpret_cast<HWND>(wParam);
    LPCOPYDATASTRUCT pcds = reinterpret_cast<LPCOPYDATASTRUCT>(lParam);
    DWORD dwCustomMsg = pcds->dwData;
    LPVOID pCustomData = pcds->lpData;
    DWORD dwCustomDataSize = pcds->cbData;

    // do something with the custom message

    // return TRUE to indicate message received
    return TRUE;
}

のドキュメントの重要な注意事項にも注意してくださいWM_COPYDATA

受信アプリケーションは、データを読み取り専用と見なす必要があります。lParam パラメータは、メッセージの処理中にのみ有効です。受信アプリケーションは、lParam によって参照されるメモリを解放しないでください。SendMessage が返された後に受信アプリケーションがデータにアクセスする必要がある場合は、データをローカル バッファにコピーする必要があります。

于 2013-04-30T19:57:38.533 に答える