【问题标题】:Is it possible to know exactly what numpad key is pressed in AS3 (with Num Lock disabled)?是否可以确切地知道在 AS3 中按下了哪个小键盘键(禁用 Num Lock)?
【发布时间】:2010-11-27 12:12:47
【问题描述】:

在 Actionscript 3 中,我看到如果我按下“8”键(来自数字键盘),我得到了数字键盘“8”的 keyCode 的结果,但是当我禁用“Num Lock”并按下数字键盘键时“8”,我收到向上箭头键的keyCode的事件...

小键盘的按键(禁用Num Lock)与原键如Arrows、End、Insert、Delete等如何区分?

我尝试使用事件的keyLocation 属性,该属性的值是箭头的 0 和小键盘的 3,但是当禁用 Num Lock 时,4、6、2 和数字键盘中的 8 是 0,所以我无法区分数字键盘禁用的数字和箭头键。

Keyboard 类的 numLock 属性也不起作用,因为我不知道我是按向上箭头还是禁用了 8 whit Num Lock(因为它们触发了相同的事件,或者我认为那个)

【问题讨论】:

    标签: apache-flex flash actionscript-3 keyboard


    【解决方案1】:

    我无法找到一种方法来满足您的要求。我怀疑实际的关键代码本身被操作系统层驱动程序吸收,永远不会到达 FLEX 被读取。通过在我的 iMac(没有 MS Natural 驱动程序)上使用我的 Microsoft Natural 键盘进行测试,这一点得到了一定的重视。没有驱动程序,键盘无法打开numlock,并且键码保持不变。

    我不知道这是否有帮助,但我确实编写了一个小测试程序来确定每个平台上 flex 可以看到哪些键码、位置和字符码。

    这是测试应用的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="onApplicationComplete()" viewSourceURL="srcview/index.html">
        <mx:Script>
            <![CDATA[
                public function onApplicationComplete():void
                {
                    stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
                }
    
                public function onKeyDown(keyboardEvent:KeyboardEvent):void
                {
                    charCodeLabel.text = keyboardEvent.charCode.toString();
                    keyCodeLabel.text = keyboardEvent.keyCode.toString();
                    switch(keyboardEvent.keyLocation)
                    {
                        case KeyLocation.LEFT:
                            keyLocationBox.text = "Left";
                            break;
                        case KeyLocation.NUM_PAD:
                            keyLocationBox.text ="Num Pad";
                            break;
                        case KeyLocation.RIGHT:
                            keyLocationBox.text = "Right";
                            break;
                        default:
                            keyLocationBox.text = "Standard";
                    }
    
                }
            ]]>
        </mx:Script>
        <mx:Label x="46" y="34" text="Just click anywhere inside the flash movie and start typing."/>
        <mx:Label x="46" y="72" text="You typed Char Code:"/>
        <mx:Label x="232" y="72" text="Key Code:"/>
        <mx:Label x="183" y="72" id="charCodeLabel"/>
        <mx:Label x="303" y="72" id="keyCodeLabel"/>
        <mx:Label x="46" y="98" text="Key Location:"/>
        <mx:Label x="134" y="98" width="68" id="keyLocationBox"/>
    
    </mx:Application>
    

    如果需要,您也可以简单地使用我在此处上传的实时版本:Flex Online Key Code Tool

    【讨论】:

    • 我同意这在 Flash 中是不可能的。不过,我不认为区别在于驱动程序级别,因为我很确定其他平台(例如 .exe)可以区分这两个事件。
    • 谢谢,我对此感到非常难过。为什么这在 Flash 中是不可能的?好可怜……
    【解决方案2】:

    也许这会对你有所帮助...

    package {
        import flash.utils.Dictionary;
        import flash.ui.Keyboard;
        import flash.events.KeyboardEvent;
        import flash.display.Sprite;
    
        public class Main extends Sprite {
    
            private static const _NUMERIC_KEYS:Dictionary=new Dictionary();
            {
            _NUMERIC_KEYS[45]=0;
            _NUMERIC_KEYS[35]=1;
            _NUMERIC_KEYS[40]=2;
            _NUMERIC_KEYS[34]=3;
            _NUMERIC_KEYS[37]=4;
            _NUMERIC_KEYS[12]=5;
            _NUMERIC_KEYS[39]=6;
            _NUMERIC_KEYS[36]=7;
            _NUMERIC_KEYS[38]=8;
            _NUMERIC_KEYS[33]=9;
            }
    
            public function Main() {
                stage.addEventListener(KeyboardEvent.KEY_UP, stageKeyUp);
            }
    
            private function stageKeyUp(e : KeyboardEvent) : void {
                if(Keyboard.numLock){
                    trace("NumLock ON :",String.fromCharCode(e.charCode));
                }else{
                    trace("NumLock OFF :", _NUMERIC_KEYS[e.keyCode]);
                }
            }
        }
    }
    

    【讨论】:

    • 这对我没有帮助.. 当 NumLock 被禁用时.. 你如何区分 NumPad 上的“UpArrow”和“8”?在您的示例中:您如何区分数字键盘上的数字键或数字键?..这绝对没有帮助。
    【解决方案3】:

    据我了解,这是不可能的,因为 Flash 必须支持的两种不同的插件架构之间存在差异和限制(为了在 IE(activeX) 和其他一切中工作)。抱歉 - 它确实咬人。

    【讨论】:

      【解决方案4】:

      编辑:

      我看到 AutoHotkey 可以做到这一点。所以可以做到。我错了:(

      但又一次.. 这似乎在 Flash Player 中是不可能的。


      我已经运行了几项测试,Assembler 中的一个给我这个结果:

      启用 NumLock:

      • 数字键 8 键:AX=4838
      • 向上箭头:AX=4800

      在禁用 NumLock 的情况下:

      • 数字键 8 键:AX=4800
      • 向上箭头:AX=4800

      PS:我使用INT 16H,所以它返回(在AX中)按下的键的KeyCode和ScanCode。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2023-04-07
      • 2019-01-07
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多