2010-07-09 3 views
0

Я пытаюсь установить глобальный крюк GetMessage для всех потоков. Это моя DLL:WH_GETMESSAGE global hook not working

#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; 
} 

My WinMain загружает библиотеку, получает процедуру и устанавливает крючок. Однако MessageBeep никогда не вызывается. Что-то я здесь делаю неправильно?

Кроме того, еще одна вещь беспокоила меня. В этом вызове:

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

я был вынужден использовать «GetMsgProc @ 12», потому что я не мог получить это право любого другого пути. Может кто-нибудь, пожалуйста, скажите мне, как я должен использовать файл .def или что-то еще, поэтому я могу просто использовать его как «GetMsgProc»? Хотя MSDN заявила, что, поскольку у меня есть __declspec (dllexport) в моей декларации, мне это не понадобится ...

Моя IDE - код :: Блоки с MinGW. Заранее спасибо.

+0

Чтобы ответить на ваш последний вопрос, вы хотите использовать 'extern 'C" для предотвращения манипуляции с именем. Однако не уверен в первом; вы подтвердили, что на самом деле вы отправляете какие-либо сообщения? – Shog9

+0

И DLL, и EXE закодированы и скомпилированы в C, поэтому я не могу использовать extern «C». Я бы подумал, что я могу переключиться на любую программу, щелкнуть в любом месте, чтобы отправить сообщение, и это вызовет мой GetMsgProc. Однако, поскольку MessageBeep не вызывается, это не так. – kaykun

+0

Эх, я в любом случае ошибаюсь. Смотрите: http://stackoverflow.com/questions/366228/def-files-c-c-dlls – Shog9

ответ

2

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

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

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