I am trying to completely disable the letter 'a' on the keyboard using lowlevel keyboard hook. The problem is that when i return 0 from keyboardproc the key is not disabled but when i return 1 it gets disabled. I thought that returning from keyboardproc without calling
CallNextHookEx blocks the message. Is there any difference between returning 0 and returning 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);
}
Best Solution
From the
LowLevelKeyboardProc
MSDN documentation:[emphasis mine]
So it's not entirely well documented, what happens if you actually
return 0
. I'd guess this value causes the system to call the next hook procedure in the chain anyway, and it eventually gets processed by your default window procedure.I have recently written a simple app that requires you to hold Caps Lock for a given amount of time in order to toggle it, and whenever I actually handle this key in my
LowLevelKeyboardProc
, I always return 1, otherwiseAdditional note: If you're targetting NT/XP/2003 and newer systems, you can pass
NULL
in the firstCallNextHookEx
parameter, since it's ignored.