C ++ Win32: преобразование кода сканирования в символ Unicode - PullRequest
2 голосов
/ 17 апреля 2011

Когда я переключаюсь на русскую раскладку в Windows 7 и нажимаю клавишу ; на клавиатуре, я получаю русскую букву ж на экране.

Я работаю над приложением, в котором мне нужно обнаружить нажатые клавиши и нарисовать текст на экране.Требование обрабатывать все поддерживаемые языки.Это мой код:

// I scan the keyboard for pressed keys
for (short key = KEY_SCAN_MIN; key <= KEY_SCAN_MAX; ++key)
{
    if (GetAsyncKeyState(key) & 0x8000)
    {

// When I detect a pressed key, I convert the scan code into virtual key. 
// The hkl is current keyboard layout parameter, which is Russian.
UINT virtualKey = MapVirtualKeyEx((UINT)key, MAPVK_VK_TO_CHAR, hkl);

// Next I get the state of the keyboard and convert the virtual key 
// into Unicode letter
if (!GetKeyboardState(kbrdState))
{
     continue;
}

// unicode is defined as wchar_t unicode[2];                    
int result = ToUnicodeEx(virtualKey, key, (BYTE*)kbrdState, unicode, 2, 0, hkl);

Все отлично работает, кроме пары букв на русском языке, и я не могу понять, почему.Одно конкретное письмо, которое не работает: ж .Когда я пытаюсь перевести его скан-код, переводом является б , что является другой русской буквой.

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

short test = VkKeyScanEx(L'ж', hkl);

Значение переменной test равно 1078!Я не понимаю, почему преобразование буквы ж в виртуальную клавишу дает мне 1078, но преобразование виртуальной клавиши 1078 (с использованием той же раскладки клавиатуры) дает мне б .

1 Ответ

2 голосов
/ 03 сентября 2011

Я всегда использую WM_CHAR для чтения кодов сканирования, поскольку он выполняет перевод для вас и возвращает последний символ в UTF-16.Работает со всеми языками, даже с теми, на которых требуется более одного нажатия клавиши для обозначения одного символа.

...