为何全局钩子无法屏蔽系统消息?

实现了基本的窗口类注册,创建窗口,消息循环和窗口过程。

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