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