0

別のプロセスで実行されているウィンドウに送信されたメッセージを傍受して、それらのいくつかに反応できるようにしようとしています。

注入アプリケーションは、p/invokeを介してこのメ​​ソッドを呼び出すx86WPFアプリケーションです。別のx86プロセスでウィンドウにハンドルを渡します。

extern "C" BOOL INJ_API ::InterceptMessages(HWND hWnd)
{
    if (!WM_MY_INJECT)
    {
        WM_MY_INJECT = RegisterWindowMessage(TEXT("WM_MY_INJECT"));
    }

    // Get the ID of the thread running the window.
    DWORD ThreadId = GetWindowThreadProcessId(hWnd, NULL);

    // Set the hook
    hhk = SetWindowsHookEx(WH_GETMESSAGE, HookProc, hinstDLL, ThreadId);

    // hhk is non-zero, so the hook is set up

    // This will block until the WM_MY_INJECT message is processed, the hook is unhooked, and we are done injecting the application.
    LRESULT result = SendMessage(hWnd, WM_MY_INJECT, NULL, NULL);

    return TRUE;
}

結果が正しい値であるため、メッセージが送信されていることがわかります。ただし、DLLが他のプロセスによってロードされることはなく、フックがメッセージをインターセプトせずにメッセージが呼び出されます。

4

1 に答える 1

2

WH_GETMESSAGEGetMessage()またはによってメッセージキューから取得されたメッセージをフックするためのものPeekMessage()です。で送信されるメッセージはSendMessage()これらの関数を通過しないため、WH_GETMESSAGEフックはトリガーされません。PostMessage()の代わりにをSendMessage()使用するか、フックの代わりにWH_CALLWNDPROCまたはフックを使用する必要があります。WH_CALLWNDPROCRETWH_GETMESSAGE

于 2013-02-05T02:36:55.917 に答える