2013-02-05 40 views
0

我試圖攔截髮送到另一個進程中運行的窗口的消息,以便我可以對其中的一些進行響應。SetWindowsHookEx無法注入

注入應用程序是一個x86 WPF應用程序,通過p/invoke調用此方法。我將句柄傳遞給另一個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永遠不會被其他進程加載,並且在我的鉤子攔截它的情況下調用該消息。

+0

您確定您有權注入? – hbprotoss

+0

我在沒有UAC的情況下運行64位Windows 7 ...這兩個應用程序都由同一臺桌面上的同一個用戶運行,據我所知,我應該有權限。 –

回答

2

WH_GETMESSAGE用於掛鉤從消息隊列中刪除的消息GetMessage()PeekMessage()。與SendMessage()發送的郵件不會通過這些功能,因此不會觸發WH_GETMESSAGE掛鉤。您需要使用PostMessage()而不是SendMessage(),或者使用WH_CALLWNDPROCWH_CALLWNDPROCRET鉤子而不是WH_GETMESSAGE鉤子。

+0

我應該提到我也嘗試了與WH_CALLWNDPROC相同的代碼,並且具有完全相同的問題。 –

+0

調用'PeekMessage()',而不是'SendMessage()'解決了我的問題。 –