【问题标题】:Capturing Cmd-C (or Ctrl-C) keyboard event from modular Flex application in browser or AIR从浏览器或 AIR 中的模块化 Flex 应用程序捕获 Cmd-C(或 Ctrl-C)键盘事件
【发布时间】:2008-08-28 08:34:09
【问题描述】:

在浏览器中运行 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”键(如代码示例所示)还是提供复制按钮?

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

【问题讨论】:

    标签: apache-flex air


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我找到了一种基于捕获序列的解决方法。例如,当你按下 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!
                    }
                }
            }
        

        【讨论】:

        • 只是想评论说您可以导入 flash.ui.Keyboard 并使用 Keyboard.CONTROL、Keyboard.A 等,而不必知道 keyCodes :-)
        【解决方案4】:

        对我来说,以下工作:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-13
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 2010-10-10
          相关资源
          最近更新 更多