2008-08-28 13 views
3

Es scheint, dass es nicht möglich ist, das Tastaturereignis normalerweise für kopieren beim Ausführen einer Flex-Anwendung im Browser oder als AIR zu erfassen App, vermutlich weil der Browser oder das Betriebssystem es zuerst abfängt.Capture Cmd-C (oder Ctrl-C) Tastaturereignis von modularen Flex-Anwendung in Browser oder AIR

Gibt es eine Möglichkeit, dem Browser oder Betriebssystem mitzuteilen, dass das Ereignis durchgelassen werden soll?

Zum Beispiel auf einem Advanced Ich habe das keyUp Ereignis handleCaseListKeyUp (event) festgelegt, die die folgende Funktion aufruft:

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

Wenn er gestartet wird, kann ich nie die Freigabe der Taste „C“ erhalten während auch die Befehlstaste gedrückt wird (was als KeyboardEvent.ctrlKey angezeigt wird). Ich erhalte die folgende Trace-Ergebnisse:

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

Wie Sie sehen können, ist die einzige Veranstaltung, die ich ist die Freigabe des Befehlstaste erfassen kann, die Freigabe der „C“ -Taste gedrückt, während Sie die Taste Befehl hält nicht einmal ist geschickt.

Hat jemand erfolgreich Standard-Kopieren und Einfügen Tastaturhandhabung implementiert?

Soll ich einfach die Taste "C" verwenden (wie im Codebeispiel gezeigt) oder eine Kopie-Schaltfläche verfügbar machen?

Oder muss ich den Listener manuell auf einer höheren Ebene erstellen und das Ereignis in die Eingeweide meiner modularen Anwendung weiterleiten?

Antwort

2

Ich habe einen Test gemacht, wo ich für Tastenereignisse auf der Bühne lauschte und bemerkte, dass ich (auf meinem Mac) Control-C, Control-V usw. gut erfassen konnte, aber alles mit Befehl (die  -Taste) wurde nicht erfasst, bis ich den Befehlsschlüssel losgelassen habe, und dann war ctrlKey falsch (obwohl die Dokumentation sagt, dass ctrlKey für die Befehlstaste auf dem Mac wahr sein sollte), und der charCode war 0. Ziemlich nutzlos, kurz gesagt.

0

Eine weitere unglaublich ärgerliche Sache, die ich nur erkannt, dass ctrl-c nicht durch event.ctrlKey && event.keyCode = Keyboard.C erfaßt werden kann (oder ... event.charCode == 67), anstatt Du für charCode oder keyCode seine 3 zu testen. Es macht einen Sinn für charCode, da ctrl-c ist 3 in der ASCII-Tabelle, aber es macht keinen Sinn für keyCode, die den Schlüssel auf der Tastatur, nicht das eingegebene Zeichen darstellen soll. Dasselbe gilt für alle anderen Tastenkombinationen (da jede Ctrl-Kombination ein ASCII-Äquivalent hat).

bearbeiten einen Fehler in der Flex Bug System über diese Gefunden: https://bugs.adobe.com/jira/browse/FP-375

0

Für mich sind die folgenden Werke:

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

ich eine Abhilfe für diese auf der Capture-basierte gefunden haben Sequenz.Wenn Sie Cmd + A drücken, zum Beispiel, ist die Reihenfolge:

  • Typ: KEY_DOWN, keyCode 15
  • Typ: KEY_UP, keyCode 15
  • Typ: KEY_DOWN, keyCode 65

Jedes Mal, wenn Sie keyCode 15 herunter und dann hoch und das nächste Capture herunterfahren, können Sie davon ausgehen, dass der Benutzer die Tastenkombination gedrückt hat. Meine Implementierung Ende so zusammen:

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

nur einen Kommentar abgeben wollte und sagen, dass Sie flash.ui.Keyboard importieren und verwenden können Keyboard.CONTROL, Keyboard.A usw. anstatt die keycodes wissen :-) – Seaux