2009-05-06 4 views
1

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

ответ

3

От LowLevelKeyboardProc MSDN documentation:

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

[курсив мой]

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

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

CallNextHookEx(NULL, nCode, wParam, lParam); 

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

0

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

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

Смежные вопросы