Я пытаюсь установить глобальный крюк 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. Заранее спасибо.
Чтобы ответить на ваш последний вопрос, вы хотите использовать 'extern 'C" для предотвращения манипуляции с именем. Однако не уверен в первом; вы подтвердили, что на самом деле вы отправляете какие-либо сообщения? – Shog9
И DLL, и EXE закодированы и скомпилированы в C, поэтому я не могу использовать extern «C». Я бы подумал, что я могу переключиться на любую программу, щелкнуть в любом месте, чтобы отправить сообщение, и это вызовет мой GetMsgProc. Однако, поскольку MessageBeep не вызывается, это не так. – kaykun
Эх, я в любом случае ошибаюсь. Смотрите: http://stackoverflow.com/questions/366228/def-files-c-c-dlls – Shog9