Можно ли точно узнать, какая цифровая клавиша нажата в AS3 (с отключенной Num Lock)? - PullRequest
3 голосов
/ 11 сентября 2009

В ActionScript 3 я вижу, что если я нажимаю клавишу «8» (с цифровой клавиатуры), я получаю результат keyCode цифровой клавиши «8», но когда я отключаю «Num Lock» и нажимаю цифровую клавишу «8», событие, я получаю keyCode клавиши со стрелкой вверх ...

Как сделать различие между клавишами цифровой клавиатуры (с отключенной Num Lock) и оригинальными клавишами, такими как стрелки, конец, вставка, удаление и т. Д.?

Я пытался использовать свойство keyLocation события, значение этого свойства равно 0 для стрелок и 3 для цифровой клавиатуры, но когда Num Lock отключен, значение для 4, 6, 2 и 8 в цифровой клавиатуре равны 0, поэтому я не могу отличить цифры с отключенной цифровой клавиатурой и клавиши со стрелками.

Кроме того, свойство numLock класса Keyboard не работало, потому что я не могу знать, нажимаю ли я клавишу Стрелка вверх или отключен Num Lock на 8 символов (потому что они вызывают одно и то же событие, или я думаю что)

Ответы [ 4 ]

0 голосов
/ 15 сентября 2009

EDIT:

Я вижу, что AutoHotkey МОЖЕТ сделать это. Так что это может быть сделано. Я был не прав :(.

Но опять же ... Кажется, что это невозможно внутри Flash Player.


Я провел несколько тестов, и один в Ассемблере выдает мне такой результат:

При активированной NumLock:

  • Ключ Numpad 8: AX=4838
  • Стрелка вверх: AX=4800

При отключенном NumLock:

  • Ключ Numpad 8: AX=4800
  • Стрелка вверх: AX=4800

PS: я использую INT 16H, поэтому он возвращает (в AX) KeyCode и ScanCode нажатой клавиши.

0 голосов
/ 14 сентября 2009

Может быть, это поможет вам ...

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]);
            }
        }
    }
}
0 голосов
/ 15 сентября 2009

Насколько я понимаю, это невозможно из-за различий и ограничений между двумя разными архитектурами плагинов, которые Flash должны поддерживать (для работы в IE (activeX) и во всем остальном). Извините - это кусается.

0 голосов
/ 13 сентября 2009

Я не смог найти способ сделать то, что вы просите. Я подозреваю, что сам код ключа поглощается драйвером уровня ОС и никогда не достигает FLEX для чтения. Это придало некоторый вес тестированию с моей клавиатурой Microsoft Natural на моем iMac (который не имеет драйверов MS 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

...