我正在尝试使用低级键盘挂钩完全禁用键盘上的字母'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);
}
答案 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',你想要的行为是返回非零,否则返回零。