3

Flex アプリケーションをブラウザーで実行するとき、または AIR アプリとして実行するときに、通常はコピーに使用されるキーボード イベントをキャプチャすることはできないようです。おそらく、ブラウザーまたは OS が最初にインターセプトしているためです。

イベントを通過させるようにブラウザまたは 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" キーを単独で使用するか、コピー ボタンを使用できるようにするか?

それとも、リスナーをより高いレベルで手動で作成し、イベントをモジュラー アプリケーションの内部に渡す必要がありますか?

4

4 に答える 4

2

ステージでキーアップ イベントをリッスンするテストを行ったところ、(私の Mac では) control-c、control-v などは問題なくキャプチャできるが、コマンド ( キー) を含むものはすべてキャプチャできないことがわかりました。コマンドキーを離すまでキャプチャすると、ctrlKeyがfalseになり(MacのコマンドキーではctrlKeyがtrueになるはずだとドキュメントに記載されていますが)、charCodeは0でした。要するに、かなり役に立ちません。

于 2008-08-28T12:32:06.563 に答える
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

私が気付いたもう 1 つの信じられないほど厄介なことは、ctrl-c はevent.ctrlKey && event.keyCode = Keyboard.C(or ... ) でキャプチャできないことです。代わりに、 orevent.charCode == 67をテストする必要 があります。ctrl-c はASCIIテーブルにあるので意味がありますが、入力された文字ではなく、キーボードのキーを表すと想定されている には意味がありません。同じことが他のすべてのキー コンボにも当てはまります (すべての ctrl コンボには ASCII に相当するものがあるため)。charCodekeyCode3charCode3keyCode

編集Flex バグ システムでこれに関するバグが見つかりました: https://bugs.adobe.com/jira/browse/FP-375

于 2008-09-07T13:27:17.020 に答える
0

キャプチャ シーケンスに基づいて、これに対する 1 つの回避策を見つけました。たとえば、Cmd+A を押すと、シーケンスは次のようになります。

  • タイプ: KEY_DOWN、keyCode 15
  • タイプ: KEY_UP、キーコード 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 に答える