Отключение ключей с помощью хуков Windows - PullRequest
2 голосов
/ 06 мая 2009

Я пытаюсь полностью отключить букву «а» на клавиатуре, используя низкоуровневую клавиатуру. Проблема в том, что когда я возвращаю 0 из клавиатуры, ключ не отключается, но когда я возвращаю 1, он отключается. Я думал, что возвращаясь с клавиатуры Proc без звонка 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 ]

5 голосов
/ 07 мая 2009

Из документации LowLevelKeyboardProc MSDN :

Если процедура подключения обработала сообщение, она может вернуть ненулевое значение , чтобы система не могла передать сообщение остальной части цепочки подключения или процедуре целевого окна.

[Акцент шахты]

Так что это не совсем хорошо задокументировано, что произойдет, если вы на самом деле return 0. Я предполагаю, что это значение заставляет систему вызывать следующую подключаемую процедуру в цепочке в любом случае, и в конечном итоге она обрабатывается вашей оконной процедурой по умолчанию.

Недавно я написал простое приложение, которое требует, чтобы вы удерживали Caps Lock в течение заданного промежутка времени, чтобы переключать его, и всякий раз, когда я фактически обрабатываю этот ключ в моем LowLevelKeyboardProc, я всегда возвращаю 1, в противном случае

CallNextHookEx( NULL, nCode, wParam, lParam );

Дополнительное примечание: если вы ориентируетесь на NT / XP / 2003 и более новые системы, вы можете передать NULL в первом параметре CallNextHookEx, так как он игнорируется.

1 голос
/ 07 июня 2009

Если вы вызываете CallNextHook (), вызывается следующий хук в цепочке. Если вы вернете ненулевое значение, сообщение не будет получено целевым окном (что не позволяет окну получать сообщение с клавиатуры). Если вы вернете ноль, сообщение будет получено целевым окном.

Ваше желаемое поведение - возвращать ненулевое значение, если нажата клавиша «a», и ноль в противном случае.

...