Узнать символ нажатой клавиши
Если я добавлю слушателя в KeyboardEvent.KEY_DOWN, я могу узнать код ключа и код.
код ключа отображается на другой символ в зависимости от клавиатуры.
код также бесполезен, согласно справке:
значения символьного кода являются значениями английской клавиатуры. Например, если вы нажмете Shift+3, charCode будет # на японской клавиатуре, как и на английской.
Итак, как я могу узнайте, какой символ нажал пользователь?
4 ответов
вы пропустили довольно важную часть цитаты или она отсутствовала там, где вы ее нашли:
например, если нажать Shift+3, то getASCIICode () метод возвращает # on a Японская клавиатура, как и на английская клавиатура.
http://livedocs.adobe.com/flex/201/langref/flash/events/KeyboardEvent.html
Это, вероятно, более полезно:
свойство charCode является числовое значение этого ключа в текущем наборе символов (набор символов по умолчанию-UTF-8, который поддерживает ASCII).
ваше приложение определяет, какой набор символов используется, что означает, что даже если вам придется использовать отдельные клавиши разных локальных клавиатур для создания одного и того же символа, он будет иметь тот же аргументом charcode.
Примечание: (это касается сообщений клавиатуры в целом и не относится только к actionscript. Я неправильно понял вопрос и дал более глубокий ответ, тогда был полезен)
действительно, путь от клавиатуры до Windows char очень сложный, он идет примерно так:
- клавиатура отправить scancode драйвер клавиатуры устройства (KDD).
- KDD отправляет сообщение в очередь системных сообщений.
- система после этого отправляет сообщение в поток переднего плана, который создал окно с текущим фокусом клавиатуры.
- цикл сообщений потока подбирает сообщение и вычисляет правильный перевод символов.
"реальный" символ, который был набран, не вычисляется до тех пор, пока он не завершит весь процесс, поскольку каждое окно и поток могут быть на другом языке, и вы не можете действительно "перевести" ключ, не зная историю буфера языка и ключа.
"WM_KEYDOWN" и " WM_KEYUP" сообщения не могут быть преобразованы с помощью MapVirtualKey или чего-то еще, потому что вы не знаете, сколько нажатий клавиш составляют один символ. Простой метод - просто обработать событие "WM_CHAR" и использовать его. Рассмотрим следующее:
- en-US locale, вы нажимаете следующие клавиши a + '+ a, вы получаете следующий вывод "a'a"
- PT-BZ locale, вы нажимаете следующие клавиши a + '+ a, вы получаете следующий вывод "aá"
Итак, в обоих примерах вы получил бы 3 сообщения KEYDOWN, KEYUP, но в первом вы получаете 3 WM_CHAR, а во втором вы получаете только 2.
следующая статья действительно хороша для базовых понятий: http://msdn.microsoft.com/en-us/library/ms646267 (VS.85).aspx
вы не можете эффективно использовать charCode
или keyCode
чтобы определить введенный символ. Вы должны сравнивать только строки. The KeyboardEvent
не дает вам введенный текст, что также глупо.
в моем случае я реализовал KeyboardEvent.KEY_DOWN
событие в дополнение к TextEvent.TEXT_INPUT
событие. В обработчике для последнего я реализовал всю функциональность, где charCode
был необходим и не менялся в зависимости от локали клавиатуры (например. пробел или Enter). В первом я проверил текст свойство события, чтобы сравнить, что мне нужно независимо от локали.
забыл упомянуть, что этот пост намекнул мне, что решение: как узнать символ нажатой клавиши на языках?
ввод символов японской хираганы и т. д. часто требует нескольких нажатий клавиш, а иногда даже выбора соответствующего символа из выпадающего меню. Вероятно, вы хотите прослушать другое событие, что-то вроде события изменения текстового поля.