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。提前致謝。
要回答你的最後一個問題,你想使用'extern「C」'來防止名稱混亂。雖然不確定第一個;你是否證實你實際上正在發送任何消息? – Shog9 2010-07-09 03:05:00
這兩個DLL和EXE編碼和編譯在C中,所以我不能使用extern「C」。我認爲我可以切換到任何程序,點擊任何地方發送消息,它會調用我的GetMsgProc。但是,由於沒有調用MessageBeep,所以情況並非如此。 – kaykun 2010-07-09 03:10:27
呃,反正我錯了。請參閱:http://stackoverflow.com/questions/366228/def-files-c-c-dlls – Shog9 2010-07-09 03:20:07