Find out the character pressed key

If I add a listener to KeyboardEvent.KEY_DOWN, I can find out the keyCode and the charCode.

The keyCode maps to a different character depending on the keyboard.

The charCode is just as useless, according to the help:

The character code values are English keyboard values. For example, if you press Shift+3, charCode is # on a Japanese keyboard, just as it is on an English keyboard.

So, how can I find out which character the user pressed?


You left out a pretty important part of the quote or it was missing where you found it:

For example, if you press Shift+3, the getASCIICode() method returns # on a Japanese keyboard, just as it does on an English keyboard.

http://livedocs.adobe.com/flex/201/langref/flash/events/KeyboardEvent.html

This is probably more helpful:

The charCode property is the numeric value of that key in the current character set (the default character set is UTF-8, which supports ASCII).

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

Your application determines what characters set is used, meaning that the even if you have to use separate keys of different keyboard locals to produce the same character, it will have the same charCode.


NOTE: (This is about keyboard messages in general and does not apply to actionscript alone. I misread the question and provided a deeper answer then was helpful)

Really, the path from keyboard to windows char is a VERY complex one, it goes something like this:

  • Keyboard send scancode to Keyboard device driver (KDD).
  • KDD sends a message to the system message queue.
  • The system then sends the message to the foreground thread that created the window with the current keyboard focus.
  • The thread's message loop picks up the message and figures out the correct character translation.
  • The 'real' char that was typed is not calculated until it finishes that whole process, as each window and thread can be on a different locale and you can't really 'translate' the key without knowing the locale and key buffer history.

    The "WM_KEYDOWN" and "WM_KEYUP" messages cannot just be converted with MapVirtualKey or something because you don't know how many key presses make up a single char. The simple method is just handle the 'WM_CHAR' event and use that. Consider the following:

  • en-US locale, you press the following keys a + ' + a, you get the following output "a'a"
  • pt-BZ locale, you press the following keys a + ' + a, you get the following output "aá"
  • So in both examples you would get 3 KEYDOWN, KEYUP messages, but in the first you get 3 WM_CHAR and in the second you only get 2.

    The following article is really good for the basic concepts: http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx


    You cannot effectively use charCode or keyCode to determine the character that was entered. You must compare strings only. The KeyboardEvent does not give you the entered text, which is also silly.

    In my case I implemented a KeyboardEvent.KEY_DOWN event in addition to a TextEvent.TEXT_INPUT event. In the handler for the latter I implemented all functionality where the charCode was needed and didn't vary per keyboard locale (eg. space bar or enter). In the the former I checked for the text property of the event to compare what I needed locale independent.

    Forgot to mention that this post hinted me to that solution: How to find out the character pressed key in languages?

    链接地址: http://www.djcxy.com/p/42510.html

    上一篇: 任何使用过Django和JQuery Autocomplete的人?

    下一篇: 找出字符按下的键