2009-05-18 74 views
1

我正在嘗試使用Windows鉤子檢索另一個應用程序的消息。我用SetWindowsHookEx設置了一個WH_GETMESSAGE鉤子。這是通過一個DLL完成的。在我的GetMsgProc函數中(每當目標應用程序收到消息時應該調用它),我想根據消息的類型採取行動。但是,我有這個if語句有問題。在Hook過濾函數中過濾Windows消息

LRESULT CALLBACK MessageHookProcedure(int code, WPARAM wParam, LPARAM lParam){ 
    if(((MSG*)lParam)->message == WM_COMMAND){ 
     MessageBox(NULL,L"The hook procedure was called",L"Test Window",MB_OK); 
    } 

    return CallNextHookEx(g_MessageHook,code,wParam,lParam); 
} 

由於某種原因,MessageBox從不創建。我知道應用程序正在從Spy ++接收WM_COMMAND消息。如果我取出IF語句,MessageBox會一次又一次地被創建,因爲它接收到各種消息。

回答

1

您確定分別掛鉤了正確的窗口或正確的消息嗎?在某些情況下,生成WM_SYSCOMMANDWM_MENUCOMMAND而不是WM_COMMAND

您的代碼看起來不錯,您是否還嘗試將傳入消息轉儲到控制檯?

+0

我認爲你是對的,我必須掛鉤錯誤的窗口。我會檢查我的邏輯。感謝您查看我的代碼。 – JohnG 2009-05-19 01:22:13

0

這裏的LPARAM是一個指向CWPSTRUCT的指針,它又包含消息參數。以下應該工作。

LRESULT CALLBACK MessageHookProcedure(int code, WPARAM wParam, LPARAM lParam){ 
    if(((CWPSTRUCT*)lParam)->message == WM_COMMAND){ 
     MessageBox(NULL,L"The hook procedure was called",L"Test Window",MB_OK); 
    } 

    return CallNextHookEx(g_MessageHook,code,wParam,lParam); 
} 
+0

你的評論也有幫助。我實際上獲得了我需要的一個WH_CALLWNDPROC掛鉤的功能,它使用了您所提到的CWPSTRUCT。我也掛鉤了錯誤的窗口。 :) 謝謝您的幫助! – JohnG 2009-05-25 04:23:36