实现了基本的窗口类注册,创建窗口,消息循环和窗口过程。
在WinMain中创建钩子:
hook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, GetModuleHandle(NULL), 0);
钩子过程:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
return 0;
}
运行结果是hook创建成功,每次按键都可以进入钩子过程,但是实际上按键并没有被屏蔽,打开记事本或是其他程序都可以正常输入内容。猜测是记事本又添加了低级钩子导致我的钩子优先级较低,之后尝试循环重置我的钩子,依然无效。
无论是键盘低级钩子还是鼠标的低级钩子都是这种情况。
按ms官方说法,全局钩子过程本身应该单独放在一个dll里面。
https://docs.microsoft.com/en-us/windows/desktop/winmsg/using-hooks
“You must place a global hook procedure in a DLL separate from the application installing the hook procedure. ”
你这样直接在一个app里搞恐怕会有不可预期的问题。
最近我也遇到了这个问题,解决方法就是加一个消息循环机制。
#include <Windows.h>
LRESULT CALLBACK HookKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { return 1; }
HHOOK hook = NULL;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookKeyboard, GetModuleHandle(NULL), 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
return 0;
}