使用Windows钩子禁用密钥

时间:2009-05-06 05:21:58

标签: 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);     
}

2 个答案:

答案 0 :(得分:4)

来自LowLevelKeyboardProc MSDN documentation

  

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

[强调我的]

因此,如果您真的return 0会发生什么事情,那么它并没有完整记录。我猜这个值会导致系统无论如何都要调用链中的下一个钩子程序,它最终会被你的默认窗口程序处理。

我最近编写了一个简单的应用程序,要求您在给定的时间内保持Caps Lock以进行切换,每当我在LowLevelKeyboardProc中实际处理此密钥时,我总是返回1,否则

CallNextHookEx( NULL, nCode, wParam, lParam );

附加说明:如果您的目标是NT / XP / 2003及更新的系统,则可以在第一个NULL参数中传递CallNextHookEx,因为它会被忽略。 < / p>

答案 1 :(得分:1)

如果调用CallNextHook(),则调用链中的下一个钩子。 如果返回非零,则目标窗口不会收到该消息(从而阻止窗口接收键盘消息)。 如果返回零,则目标窗口将收到消息。

如果按下的键是'a',你想要的行为是返回非零,否则返回零。