从浏览器或者AIR中的模块化Flex应用程序捕获Cmd-C(或者Ctrl-C)键盘事件
在浏览器中或者作为AIR应用程序运行Flex应用程序时,似乎无法捕获通常用于复制的键盘事件,大概是因为浏览器或者OS首先拦截了它。
有没有办法告诉浏览器或者操作系统让事件通过?
例如,在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"键(如代码示例所示)还是使复制按钮可用?
还是我需要在更高级别上手动创建侦听器并将事件传递到模块化应用程序的胆量中?
解决方案
回答
我做了一个测试,在舞台上听了按键事件,并注意到(在我的Mac上)我可以捕获control-c,control-v等,但是一切都与命令(?键)有关捕获,直到我释放命令键,然后ctrlKey为false(即使文档说ctrlKey对于Mac上的命令键也应为true),并且charCode为0。简而言之,这毫无用处。
回答
我刚刚意识到的另一件令人讨厌的事情是ctrl-c无法被event.ctrlKey && event.keyCode = Keyboard.C
(或者...event.charCode == 67
)捕获。测试" charCode"或者" keyCode"是否为3. 因为ctrl-c在ASCII表中为'3',所以对于'charCode'是有意义的,但是对于用于表示键盘上的键而不是键入字符的keyCode是没有意义的。其他所有键组合也是如此(因为每个ctrl组合都有一个ASCII等效项)。
编辑在Flex错误系统中找到有关此的错误:https://bugs.adobe.com/jira/browse/FP-375
回答
对我而言,以下作品:
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; } }