ToAscii/ToUnicode в захвате клавиатуры уничтожает мертвые клавиши

Кажется этим, если Вы звоните 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);
}

14
задан 00010000 31 December 2009 в 03:59
поделиться

1 ответ

  1. прекратите использовать ToAscii() и используйте ToUncode()
  2. помните, что ToUnicode может ничего не возвращать на мертвых клавишах - поэтому их называют мертвыми клавишами.
  3. Любая клавиша будет иметь сканкод или код виртуальной клавиши, но не нужный символ.

Не следует комбинировать кнопки с символами - предполагать, что любая кнопка/кнопка имеет текстовое представление (Юникод) неправильно.

Итак:

  • для ввода текста используйте символы, о которых сообщает Windows
  • для проверки нажатой кнопки - (например, для проверки нажатой кнопки ) (например, для проверки нажатой кнопки . в играх) используйте коды для сканирования или виртуальные клавиши (возможно, виртуальные клавиши лучше).
  • для клавиш быстрого доступа используйте коды для виртуальных клавиш .
3
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: