WH_GETMESSAGE глобальный хук не работает - PullRequest
0 голосов
/ 09 июля 2010

Я пытаюсь установить глобальный хук 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 с MinGW. Заранее спасибо.

1 Ответ

3 голосов
/ 09 июля 2010

Третий параметр ...

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

... - дескриптор, переданный в вашу функцию WinMain.Но он должен ссылаться на DLL, где находится функция обратного вызова - в вашем случае это будет hDLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...