Захват события клавиатуры Cmd-C (или Ctrl-C) из модульного приложения Flex в браузере или AIR - PullRequest
3 голосов
/ 28 августа 2008

Кажется, что невозможно получить событие клавиатуры, обычно используемое для копирования, при запуске приложения Flex в браузере или в качестве приложения AIR, возможно, потому, что браузер или ОС сначала его перехватывают.

Есть ли способ указать браузеру или ОС пропустить событие?

Например, в AdvancedDataGrid я установил для события keyUp значение handleCaseListKeyUp (событие), которое вызывает следующую функцию:

        private function handleCaseListKeyUp(event:KeyboardEvent):void
        {
            var char:String = String.fromCharCode(event.charCode).toUpperCase();

            if (event.ctrlKey && char == "C")
            {
                trace("Ctrl-C");
                copyCasesToClipboard();
                return;
            }

            if (!event.ctrlKey && char == "C")
            {
                trace("C");
                copyCasesToClipboard();
                return;
            }

            // Didn't match event to capture, just drop out.
            trace("charCode: " + event.charCode);
            trace("char: " + char);
            trace("keyCode: " + event.keyCode);
            trace("ctrlKey: " + event.ctrlKey);
            trace("altKey: " + event.altKey);
            trace("shiftKey: " + event.shiftKey);
        }

При запуске я не могу получить отпускание клавиши «C», одновременно нажимая клавишу команды (которая отображается как KeyboardEvent.ctrlKey). Я получаю следующие результаты трассировки:

charCode: 0
char: 
keyCode: 17
ctrlKey: false
altKey: false
shiftKey: false

Как видите, единственное событие, которое я могу зафиксировать, - это отпускание клавиши управления, отпускание клавиши «C» при удержании клавиши управления даже не отправляется.

Кто-нибудь успешно внедрил стандартную обработку клавиатуры для копирования и вставки?

Мне суждено просто использовать клавишу «C» самостоятельно (как показано в примере кода) или сделать доступной кнопку копирования?

Или мне нужно создать слушателя вручную на более высоком уровне и передать событие в кишки моего модульного приложения?

Ответы [ 4 ]

2 голосов
/ 28 августа 2008

Я провел тест, в котором я слушал события key up на сцене и заметил, что (на моем Mac) я могу захватывать control-c, control-v и т. Д. Просто отлично, но все, что связано с командой (клавиша)) не был захвачен, пока я не отпустил командный ключ, а затем ctrlKey был ложным (хотя в документах сказано, что ctrlKey должен быть истинным для командного ключа на Mac), а charCode был 0. Довольно коротко.

0 голосов
/ 23 апреля 2011

Я нашел один обходной путь для этого, основанный на последовательности захвата. Например, когда вы нажимаете Cmd + A, последовательность выглядит так:

  • тип: KEY_DOWN, keyCode 15
  • тип: KEY_UP, keyCode 15
  • тип: KEY_DOWN, keyCode 65

Таким образом, каждый раз, когда вы нажимаете клавишу codeCode 15, а затем поднимаете ее, а следующий захват снимается, вы можете предположить, что пользователь нажал комбинацию клавиш. Моя реализация заканчивается так:

    protected var lastKeys:Array;
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler, false, 0, true);
    this.stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler, false, 0, true);

    private function getCmdKey(ev:KeyboardEvent):Boolean {
        this.lastKeys.push(ev);
        this.lastKeys = this.lastKeys.splice(Math.max(0, this.lastKeys.length-3), 3);

        if (this.lastKeys.length < 3) return false;

        if (ev.keyCode != 15 && ev.type == KeyboardEvent.KEY_UP) {
            var firstKey:KeyboardEvent = this.lastKeys[0] as KeyboardEvent;
            var secondKey:KeyboardEvent = this.lastKeys[1] as KeyboardEvent;

            if (firstKey.keyCode == 15 && firstKey.type == KeyboardEvent.KEY_DOWN &&
                secondKey.keyCode == 15 && secondKey.type == KeyboardEvent.KEY_UP) {
                    return true;
            }
        }

        return false;
    }

    private function keyHandler(ev:KeyboardEvent):void {
        var cmdKey:Boolean = this.getCmdKey(ev.clone() as KeyboardEvent);
        var ctrlKey:Boolean = ev.ctrlKey || cmdKey;

        if (ctrlKey) {
            if (ev.keyCode == 65) { 
                // ctrl + "a"-- select all!
            }
        }
    }
0 голосов
/ 09 января 2009

Для меня следующие работы:

    private var _ctrlHoldFlag:Boolean = false; 

    // Do something if CTRL was held down and C was pressed
    // Otherwise release the ctrl flag if it was pressed
    public function onKey_Up(event:KeyboardEvent):void {  
        var keycode_c:uint = 67;

        if (_ctrlHoldFlag && event.keyCode == keycode_c)
        {
            //do whatever you need on CTRL-C
        }

        if (event.ctrlKey)
        {
            _ctrlHoldFlag = false;
        }
    }

    // Track ctrl key down press 
    public function onKey_Down(event:KeyboardEvent):void
    {
        if (event.ctrlKey)
        {
            _ctrlHoldFlag = true;
        }
    }
0 голосов
/ 07 сентября 2008

Еще одна невероятно раздражающая вещь, которую я только что осознал, это то, что ctrl-c не может быть захвачен event.ctrlKey && event.keyCode = Keyboard.C (или ... event.charCode == 67), вместо этого вы должны проверить, чтобы charCode или keyCode были 3. Это имеет смысл для charCode, так как ctrl-c равен 3 в таблице ASCII, но не имеет смысла для keyCode, который должен представлять клавишу на клавиатуре, а не набираемый символ. То же самое относится ко всем другим комбинациям клавиш (потому что каждая комбинация ctrl имеет эквивалент ASCII).

Редактировать Обнаружил ошибку в системе ошибок Flex по этому поводу: https://bugs.adobe.com/jira/browse/FP-375

...