使用Windows挂钩禁用按键

Nea*_*eal 3 winapi keyboard-hook

我试图使用低级键盘挂钩完全禁用键盘上的字母“ a”。问题是,当我从keyboardproc返回0时,按键未被禁用,但是当我返回1时,按键被禁用。我以为从keyboardproc返回而没有调用CallNextHookEx会阻止该消息。返回0和返回1有什么区别?

LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT* details = (KBDLLHOOKSTRUCT*) lParam;

    if(code == HC_ACTION && wParam == WM_KEYDOWN)
    {
        if(details->vkCode == 0x41)
        {
            return 1;
        }
    }

    return CallNextHookEx(g_hhkKeyboard, code, wParam, lParam);     
}
Run Code Online (Sandbox Code Playgroud)

mac*_*die 6

LowLevelKeyboardProcMSDN文档中

如果挂钩过程处理了该消息,则它可能返回一个非零值,以防止系统将该消息传递给其余的挂钩链或目标窗口过程。

[强调我的]

因此,它并没有完全有据可查,如果您实际上会发生什么return 0。我猜想这个值会导致系统无论如何都要调用链中的下一个钩子过程,最终它会由默认的窗口过程处理。

我最近写了一个简单的应用程序,要求您按住Caps Lock一定时间才能切换它,并且每当我实际在自己的键中操作时LowLevelKeyboardProc,我总是返回1,否则

CallNextHookEx( NULL, nCode, wParam, lParam );
Run Code Online (Sandbox Code Playgroud)

附加说明:如果您的目标是NT / XP / 2003和更高版本的系统,则可以传入NULL第一个CallNextHookEx参数,因为它会被忽略。