3

我正在尝试使用低级键盘挂钩完全禁用键盘上的字母“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);     
}
4

2 回答 2

8

LowLevelKeyboardProcMSDN 文档

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

[强调我的]

所以它没有完全有据可查,如果你真的return 0. 我猜这个值会导致系统调用链中的下一个钩子过程,它最终会被你的默认窗口过程处理。

我最近编写了一个简单的应用程序,要求您按住 Caps Lock 一段时间才能切换它,并且每当我实际处理我的这个键时LowLevelKeyboardProc,我总是返回 1,否则

CallNextHookEx( NULL, nCode, wParam, lParam );

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

于 2009-05-07T08:51:21.033 回答
1

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

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

于 2009-06-07T19:51:35.920 回答