ASCII-символ из VK_Code

У меня есть небольшое приложение C для WIN32, в котором я работаю с _ 1_ структура. Эта структура содержит ВК-код для нажатой клавиши.

Я пытаюсь преобразовать это в ASCII-символ. Для этого я использую функцию MapVirtualKey , что хорошо работает.

Проблема только в том, что один ВК-код может оставаться для нескольких символов. Пример:

На моей клавиатуре (швейцарско-немецкой) есть key-char .. Если я нажму Shift + ., тогда будет создан :. ВК-код такой же. Это не проблема, и я также могу проверить, нажата ли Shift или активирована ли Caps Lock.

Моя единственная проблема: как мне получить символ ':'? Мне нужна такая функция:

GetKeyChar(vkCode, shift)

Мне это нужно, чтобы получить "нормальное" и "смещенное" значение клавиатуры. Конечно, я мог бы жестко это закодировать, но мне не нравится делать это таким образом.


person Kevin Meier    schedule 04.09.2011    source источник
comment
Неправильная функция, требуется ToUnicodeEx (). У вас будут гораздо большие проблемы с мертвыми клавишами, которые есть на немецких клавиатурах. Для правильного перевода требуется состояние клавиатуры, это свойство каждого процесса. Вы можете легко получить состояние клавиатуры только своего собственного процесса, но не процесса, который в данный момент находится в фокусе. Я никогда не видел решения для этого.   -  person Hans Passant    schedule 04.09.2011
comment
на самом деле состояние клавиатуры зависит от потока   -  person Bevan Collins    schedule 07.09.2011


Ответы (4)


Проблема в том, что KBDLLHOOKSTRUCT не имеет всей информации, необходимой для перевода. Вы получаете сообщение каждый раз, когда нажимаете клавишу. Таким образом, для Shift + X вы получите сообщение о том, что была нажата клавиша Shift, и другое сообщение о том, что была нажата клавиша «X».

Вам необходимо вызвать GetKeyboardState, чтобы чтобы получить состояние клавиш Shift, Alt, Ctrl (и, возможно, других). Затем позвоните ToAsciiEx или ToUnicodeEx.

person Jim Mischel    schedule 04.09.2011
comment
Для хука клавиатуры не было бы более подходящим обновлять массив keystate вручную из входных событий? (что-то вроде BYTE k = kb.vkCode; keystate[k]&=0x80; if(!(kb.flags&LLKHF_UP)) keystate[k]|=0x80;) - person user786653; 04.09.2011
comment
Хорошо спасибо. Это сработало, я объединил GetKeyboardState с ToAsciiEx. Мертвые клавиши - это нехорошо, но это не большая проблема. - person Kevin Meier; 04.09.2011
comment
@ user786653: да, ты прав. В хуке вы, вероятно, захотите сохранить свою собственную структуру состояния клавиатуры на основе событий, а не путем вызова API. - person Jim Mischel; 05.09.2011

Вы ищете ToUnicode, который возвращает символ Юникода, сгенерированный этим нажатием клавиши.

person phihag    schedule 04.09.2011

Вам нужны следующие функции: ToAscii, ToAsciiEx, ToUnicode, ToUnicodeEx.

person Alex F    schedule 04.09.2011

short VkKeyScan(char ch) API содержит информацию о смене. Он переводит char в код виртуальной клавиши и состояние сдвига.

См. Это: Преобразование символа в соответствующий код виртуальной клавиши

person Green Su    schedule 09.11.2011