WH_GETMESSAGE全局钩子无法正常工作

时间:2010-07-09 02:49:18

标签: c winapi

我正在尝试在所有线程上设置全局GetMessage挂钩。这是我的DLL:

#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, "GetMsgProc@12")))
    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, "GetMsgProc@12")))

我被迫使用“GetMsgProc @ 12”因为我无法以任何其他方式正确使用它。有人可以告诉我我应该如何使用.def文件或其他东西,所以我可以把它作为“GetMsgProc”?虽然MSDN声明由于我在声明中有__declspec(dllexport),我不需要它......

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

1 个答案:

答案 0 :(得分:3)

第三个参数......

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

...是传递给WinMain函数的句柄。但它需要引用回调函数所在的DLL - 在您的情况下,它是hDLL