A captura de Cmd-C (ou Ctrl-C) eventos de teclado a partir de modular Flex aplicativo no navegador ou no AR

StackOverflow https://stackoverflow.com/questions/31849

  •  09-06-2019
  •  | 
  •  

Pergunta

Parece que é impossível capturar o evento de teclado normalmente usado para copiar quando executar uma aplicação Flex no navegador ou como um AR de aplicativo, presumivelmente porque o navegador ou o sistema operacional está interceptando-lo primeiro.

Existe uma maneira de dizer o navegador ou o sistema operacional para permitir que o evento através de?

Por exemplo, em um AdvancedDataGrid eu tenha definido o evento keyUp para handleCaseListKeyUp(evento), que chama a função a seguir:

        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);
        }

Quando executado, eu nunca pode obter a liberação da tecla "C", enquanto também premir a tecla de comando (que mostra KeyboardEvent.ctrlKey).Eu recebo o seguinte rastreamento de resultados:

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

Como você pode ver, o único evento que eu pode capturar é a liberação da tecla command, a liberação da tecla "C" enquanto mantém a tecla de comando não é mesmo enviados.

Alguém já implementou com sucesso o padrão de copiar e colar manipulação de teclado?

Estou destinado a apenas usar a tecla "C" para isso (como mostrado no código de exemplo) ou fazer uma cópia de botão disponível?

Ou eu preciso para criar o ouvinte manualmente nível superior, e de passar o evento para baixo em meu modular da aplicação coragem?

Foi útil?

Solução

Eu fiz um teste onde eu ouvia por cima de chave de eventos no palco e notei que no meu Mac) eu poderia capturar o control-c, control-v, etc.bem, mas qualquer coisa que envolva comando (o  chave) não foi capturado até que eu lançou a tecla de comando e, em seguida, ctrlKey era falso (mesmo que o google docs diz que ctrlKey devem ser verdadeiras para que a tecla command no Mac), e o charCode foi de 0.Inútil, em suma.

Outras dicas

Outra incrivelmente irritante coisa que eu percebi é que ctrl-c não pode ser capturado por event.ctrlKey && event.keyCode = Keyboard.C (ou ...event.charCode == 67), em vez disso, você tem que testar para charCode ou keyCode sendo 3.Ele meio que faz sentido para charCode desde ctrl-c é 3 na tabela ASCII, mas não faz sentido para keyCode, o que é suposto representar a tecla no teclado, e não o caractere digitado.O mesmo vale para todas as outras combinações de teclas (porque cada ctrl combo possui um equivalente em ASCII).

Editar Encontrou um bug no Flex bug do sistema sobre isso: https://bugs.adobe.com/jira/browse/FP-375

Eu encontrei uma solução para este baseado na seqüência de captura.Quando você pressione Cmd+A, por exemplo, a sequência é:

  • tipo:KEY_DOWN, código 15
  • tipo:KEY_UP, código 15
  • tipo:KEY_DOWN, código 65

Então toda vez que você receber um código de 15 para baixo e depois para cima, e a próxima captura é baixo, você pode assumir que o usuário pressionar a combinação de teclas.Minha implementação acabar como esta:

    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!
            }
        }
    }

Para mim, as seguintes obras:

    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;
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top