Я попытался вызвать указатель на функцию из библиотеки DLL, которая перехватывает сообщение WM_LBUTONDOWN или WM_TOUCH во всех окнах, отображаемых на экране.
У меня есть следующий исходный код DLL:
typedef void (*PtrFonct)(int nCode, WPARAM wParam, LPARAM lParam);
PtrFonct pf;
HHOOK global;
extern "C" __declspec(dllexport) LRESULT WINAPI procedure(int nCode, WPARAM wParam,LPARAM lParam)
{
if (nCode == HC_ACTION){
MSG* pMSG = (MSG*)lParam;
if (pMSG->message == WM_LBUTTONDOWN){
pf(nCode, wParam, lParam);
}
}
return CallNextHookEx(global, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) BOOL setCallback(void ((*callbackFunc)(int, WPARAM, LPARAM))){
pf = callbackFunc;
if (pf)
return TRUE;
return FALSE;
}
и мой исходный код слушателя следующий:
MSG message;
HMODULE lib = LoadLibrary(L"C:/HookTouch.dll");
if (lib) {
HOOKPROC procedure = (HOOKPROC)GetProcAddress(lib, "_procedure@12");
dllFunct fonctionCallback = (dllFunct)GetProcAddress(lib, "setCallback");
if (fonctionCallback)
fonctionCallback(MyCallback);
if (procedure)
hook = SetWindowsHookEx(WH_GETMESSAGE, procedure, lib, 0);
}
else
printf("Can't find dll!\n");
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
FreeLibrary(lib);
UnhookWindowsHookEx(hook);
Вот мой собственный обратный вызов для отображения «Привет клик»:
void MyCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
printf("Hello Click\n");
}
Я знаю, что мой хук работает, потому что я могу отображать сообщение при нажатии, используя окно сообщения вместо pf(nCode, wParam, lParam)
, но когда я использую этот указатель на функцию, MyCallback не срабатывает.
Я проверил, хорошо ли влияла моя функция на указатель на функцию pf, и все ли в порядке.
Знаете ли вы, почему вызов pf(nCode, wParam, lParam)
не вызывает функцию MyCallback слушателя?