3

在浏览器中运行 Flex 应用程序或作为 AIR 应用程序时,似乎无法捕获通常用于复制的键盘事件,可能是因为浏览器或操作系统首先拦截了它。

有没有办法告诉浏览器或操作系统让事件通过?

例如,在 AdvancedDataGrid 上,我将 keyUp 事件设置为 handleCaseListKeyUp(event),它调用以下函数:

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

运行时,我永远无法在按下命令键(显示为 KeyboardEvent.ctrlKey)的同时释放“C”键。我得到以下跟踪结果:

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

如您所见,我可以捕获的唯一事件是释放命令键,甚至没有发送在按住命令键时释放“C”键。

有没有人成功实施标准的复制和粘贴键盘处理?

我注定要单独使用“C”键(如代码示例所示)还是提供一个复制按钮?

或者我是否需要在更高级别手动创建侦听器并将事件传递到我的模块化应用程序的内部?

4

4 回答 4

2

我做了一个测试,听了舞台上的按键事件,并注意到(在我的 Mac 上)我可以很好地捕获 control-c、control-v 等,但是任何涉及命令( 键)的东西都不是在我释放命令键之前捕获,然后 ctrlKey 为假(即使文档说 ctrlKey 对于 Mac 上的命令键应该为真),并且 charCode 为 0。简而言之,非常没用。

于 2008-08-28T12:32:06.563 回答
0

我刚刚意识到的另一件令人难以置信的令人讨厌的事情是 ctrl-c 不能被event.ctrlKey && event.keyCode = Keyboard.C(or ... event.charCode == 67) 捕获,而是您必须测试charCodeor keyCode being 3charCode因为 ctrl-c在 ASCII 表中,所以这有点意义,但对于应该表示键盘上的键,而不是键入的字符,3它没有意义。keyCode所有其他键组合也是如此(因为每个 ctrl 组合都有一个 ASCII 等效项)。

编辑在 Flex 错误系统中发现了一个关于此的错误:https ://bugs.adobe.com/jira/browse/FP-375

于 2008-09-07T13:27:17.020 回答
0

对我来说,以下工作:

    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;
        }
    }
于 2009-01-09T03:28:36.447 回答
0

我找到了一种基于捕获序列的解决方法。例如,当您按 Cmd+A 时,顺序为:

  • 类型:KEY_DOWN,keyCode 15
  • 类型:KEY_UP,keyCode 15
  • 类型:KEY_DOWN,keyCode 65

因此,每次您将 keyCode 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!
            }
        }
    }
于 2011-04-22T20:58:46.867 回答