2010-07-09 109 views
0

我想在所有線程上設置一個全局的GetMessage鉤子。這是我的DLL:WH_GETMESSAGE全局鉤子不工作

#include <windows.h> 

__declspec(dllexport) LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    MessageBeep(0); 

    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

正如你所看到的,它並不多。我只是希望它在調用MessageBeep時調用它。

#include <windows.h> 

typedef LRESULT (CALLBACK *LPGetMsgProc)(int nCode, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) 
{ 
    if(!(HMODULE hDll = LoadLibrary("library.dll"))) 
    return 1; 
    if(!(LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, "[email protected]"))) 
    return 2; 

    HHOOK hMsgHook = SetWindowsHookEx(WH_GETMESSAGE, pfnProc, hInstance, 0); 

    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) {} 

    UnhookWindowsHookEx(hMsgHook); 

    return 0; 
} 

我的WinMain加載庫,獲取過程並設置鉤子。但是,MessageBeep永遠不會被調用。有什麼我在這裏做錯了嗎?

此外,另一件事一直困擾着我。在此調用中:

if(!(LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, "[email protected]"))) 

我被迫使用「GetMsgProc @ 12」,因爲我無法以任何其他方式正確使用它。有人可以告訴我我應該如何使用.def文件或其他東西,所以我可以把它作爲「GetMsgProc」?雖然MSDN聲明,因爲我在我的聲明中有__declspec(dllexport),所以我不需要它...

我的IDE是Code :: Blocks with MinGW。提前致謝。

+0

要回答你的最後一個問題,你想使用'extern「C」'來防止名稱混亂。雖然不確定第一個;你是否證實你實際上正在發送任何消息? – Shog9 2010-07-09 03:05:00

+0

這兩個DLL和EXE編碼和編譯在C中,所以我不能使用extern「C」。我認爲我可以切換到任何程序,點擊任何地方發送消息,它會調用我的GetMsgProc。但是,由於沒有調用MessageBeep,所以情況並非如此。 – kaykun 2010-07-09 03:10:27

+0

呃,反正我錯了。請參閱:http://stackoverflow.com/questions/366228/def-files-c-c-dlls – Shog9 2010-07-09 03:20:07

回答

2

第三個參數...

HHOOK hMsgHook = SetWindowsHookEx(WH_GETMESSAGE, pfnProc, hInstance, 0); 

...是傳遞到你的WinMain函數的句柄。但它需要引用回調函數駐留的DLL - 在你的情況下,這將是hDLL