【问题标题】:Find out the character pressed key找出按下的字符
【发布时间】:2009-04-14 18:54:06
【问题描述】:

如果我给 KeyboardEvent.KEY_DOWN 添加一个监听器,我可以找出 keyCode 和 charCode。

keyCode 根据键盘映射到不同的字符。

根据帮助,charCode 一样没用:

字符代码值是英文键盘值。例如,如果您按 Shift+3,则 charCode 在日文键盘上为 #,就像在英文键盘上一样。

那么,我怎样才能知道用户按下了哪个字符呢?

【问题讨论】:

    标签: apache-flex flash actionscript-3 keyboard


    【解决方案1】:

    您遗漏了引文的一个非常重要的部分,或者它在您找到它的地方丢失了:

    例如,如果您按 Shift+3,则 getASCIICode() 方法在 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。

    【讨论】:

    • 链接已过时,无论如何都没有帮助。查看我的回复。
    【解决方案2】:

    注意:(这一般是关于键盘消息,并不单独适用于 actionscript。我误读了问题并提供了更深入的答案,然后很有帮助)

    真的,从键盘到 windows char 的路径是一个非常复杂的路径,它是这样的:

    • 键盘将扫描码发送到键盘设备驱动程序 (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

    【讨论】:

      【解决方案3】:

      您无法有效地使用charCodekeyCode 来确定输入的字符。您必须只比较字符串。 KeyboardEvent 不给你输入的文字,这也很傻。

      在我的例子中,除了TextEvent.TEXT_INPUT 事件之外,我还实现了KeyboardEvent.KEY_DOWN 事件。在后者的处理程序中,我实现了所有需要charCode 的功能,并且没有因键盘区域设置而异(例如空格键或回车)。在前者中,我检查了事件的文本属性以比较我需要的独立于语言环境的内容。

      忘了提到这篇文章暗示了我该解决方案:How to find out the character pressed key in languages?

      【讨论】:

        【解决方案4】:

        键入日文平假名等字符通常需要多次击键,有时甚至需要从下拉菜单中选择合适的字符。您可能想监听不同的事件,例如文本字段的更改事件。

        【讨论】:

          猜你喜欢
          • 2010-12-23
          • 2011-05-31
          • 2010-11-04
          • 2021-07-15
          • 1970-01-01
          • 1970-01-01
          • 2019-08-07
          • 1970-01-01
          相关资源
          最近更新 更多