Кажется этим, если Вы звоните ToAscii()
или ToUnicode()
в то время как в глобальном рычаге WH_KEYBOARD_LL и мертвой клавише нажимается, это будет 'уничтожено'.
Например, скажите конфигурирование входного языка в Windows как испанский язык, и Вы хотите ввести букву с диакритическим знаком á в программе. Обычно, Вы нажали бы клавишу одинарной кавычки (мертвая клавиша), тогда буква "a", и затем на экране á с диакритическим знаком будет отображен, как ожидалось.
Но это не работает, если Вы звоните ToAscii()
или ToUnicode()
в функции захвата клавиатуры низкого уровня. Кажется, что мертвая клавиша уничтожается, и таким образом, никакая буква с диакритическим знаком á не обнаруживается на экране. Удаление вызова к вышеупомянутым функциям решает вопрос..., но к сожалению, я должен быть в состоянии вызвать те функции.
Мне Погугленный некоторое время, и в то время как у большого количества людей, казалось, была эта проблема, никакое хорошее решение, предоставили.
Любая справка очень ценилась бы!
Править: Я звоню ToAscii()
преобразовать код виртуальной клавиши и скэн-код получило в моей функции рычага LowLevelKeyboardProc в получающийся символ, который будет отображен на экране для пользователя.
Я попробовал MapVirtualKey(kbHookData->vkCode, 2)
, но это не столь "полная" функция как ToAscii()
; например, при нажатии Shift + 2 Вы доберетесь '2', не (или независимо от того, что Сдвиг + 2 произведет для раскладки клавиатуры пользователя / язык).
ToAscii()
прекрасно..., пока мертвая клавиша не нажимается.
EDIT2: вот функция рычага с несоответствующей удаленной информацией:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}
Не следует комбинировать кнопки с символами - предполагать, что любая кнопка/кнопка имеет текстовое представление (Юникод) неправильно.
Итак: