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

Другие вопросы по тегам