Узнать символ нажатой клавиши

Если я добавлю слушателя в 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).

http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000480.html

ваше приложение определяет, какой набор символов используется, что означает, что даже если вам придется использовать отдельные клавиши разных локальных клавиатур для создания одного и того же символа, он будет иметь тот же аргументом 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). В первом я проверил текст свойство события, чтобы сравнить, что мне нужно независимо от локали.

забыл упомянуть, что этот пост намекнул мне, что решение: как узнать символ нажатой клавиши на языках?


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