Windows Unicode клавиатура крюк
Я разрабатываю приложение, которое в какой-то момент должно захватывать ввод с клавиатуры и мыши. У меня не было проблем с установкой и использованием мыши, но клавиатура не работает должным образом. Мне нужно захватывать широкие символы из нескольких раскладок клавиатуры. Я нашел что-то важное, но не решил мою проблему: https://stackru.com/questions/15976108/keyboard-hook-not-capturing-unicode-in-other-threads
Вот что у меня без ненужных штучек
WinMain:
//Set the hook, with threadId = 0
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);
HKL keyboardLayout = GetKeyboardLayout(0);
//All the window and message queue code
KeyboardProc:
WCHAR unicodeChar;
BYTE keyboardLayout[256];
KBDLLHOOKSTRUCT* keyParam = (KBDLLHOOKSTRUCT*) lParam;
if(code < 0)
return CallNextHookEx(hHook, code, wParam, lParam);
if(wParam == WM_KEYDOWN)
{
GetKeyboardState(keyboardState);
int translation = ToUnicodeEx(keyParam->vkCode, keyParam->scanCode, keyboardState, &unicodeChar, 1, 0, keyboardLayout);
translation = ToUnicodeEx(keyParam->vkCode, keyParam->scanCode, keyboardState, &unicodeChar, 1, 0, keyboardLayout);
if(translation == 0 )//|| translation == -1)
return 0;
PushToBuffer(&unicodeChar);
}
//return CallNextHookEx(hHook, code, wParam, lParam);
return 0;
Я оставил закомментированный код, чтобы показать, что я уже пробовал, основываясь на том посте, который я упомянул, и документации MSDN. Push to buffer получает указатель wchar_t и сохраняет его в строке wstring, используемой в качестве буфера, которая создает дамп в wofstream.
Что просходит:
Если я вызываю ToUnicodeEx один раз, пользовательский ввод изменяется, и для него дважды отображается любая мертвая клавиша: например, в International English Layout, где вы нажимаете 'затем a, чтобы напечатать a, он показывает: ''a. После закрытия приложения пользовательский ввод возвращается в нормальное состояние.
Если я дважды вызываю ToUnicodeEx, мертвый ключ используется, и я просто показываю символ.
Интересно, почему вводится пользовательский ввод, поскольку я не изменяю ни один из параметров, заданных вызывающей стороной обратного вызова. Unicode не возможен для низкоуровневых хуков?
1 ответ
ToUnicodeEx не работает, когда дело доходит до мертвых ключей. Это то, что вы ищете: https://code.google.com/p/jnativehook/source/browse/tags/1.1.4/src/native/windows/WinUnicodeHelper.c