キーボード入力のキャプチャ

Flash Player 9 以降、Adobe AIR 1.0 以降

InteractiveObject クラスから操作モデルを継承する表示オブジェクトは、イベントリスナーを使用してキーボードイベントに応答できます。 例えば、ステージにイベントリスナーを配置してキーボード入力を監視し、それに応答できます。 次のコードでは、イベントリスナーでキーの押し下げをキャプチャして、キー名とキーコードのプロパティが表示されます。

function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (character code: " + event.charCode + ")"); 
} 
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

Ctrl キーなどの一部のキーには字形表現がありませんが、キーを押すとイベントが生成されます。

上記のコード例では、キーボードイベントリスナーがステージ全体のキーボード入力をキャプチャします。 ステージ上の特定の表示オブジェクトに対してイベントリスナーを記述することもできます。このイベントリスナーは、オブジェクトにフォーカスがあるとトリガーされます。

次の例では、ユーザーが TextField インスタンス内に入力した場合のみ、キーストロークが出力パネルに表示されます。 Shift キーを押したままにすると、TextField の境界線の色が一時的に赤に変わります。

このコードは、ステージ上に tf という名前の TextField インスタンスがあることを前提としています。

tf.border = true; 
tf.type = "input"; 
tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
tf.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: "         + event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) tf.borderColor = 0xFF0000; 
} 
 
function reportKeyUp(event:KeyboardEvent):void 
{ 
    trace("Key Released: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: " +         event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) 
    { 
        tf.borderColor = 0x000000; 
    } 
}

TextField クラスは、ユーザーがテキストを入力したときに監視できる textInput イベントも報告します。詳しくは、 テキスト入力のキャプチャ を参照してください。

注意: AIR の実行時に、キーボードイベントはキャンセルできます。Flash Player の実行時に、キーボードイベントはキャンセルできません。

キーコードおよび文字コード

キーボードイベントの keyCode プロパティと charCode プロパティを使用することで、どのキーが押されたかを判断し、その結果として他のアクションをトリガーできます。 keyCode プロパティは、キーボードのキーの値に対応する数値です。 charCode プロパティは、現在の文字セットにおけるそのキーの数値です。デフォルトの文字セットは UTF-8 で、ASCII をサポートしています。

キーコード値と文字値の主な相違点は、キーコード値がキーボードの特定のキーを表している(キーパッドの 1 は一番上の行の 1 とは異なるが、「1」を生成するキーと「!」を生成するキーは同じキーである)のに対し、文字値は特定の文字を表している(R と r の文字は異なる)ことです。

注意: ASCII のキーとその文字コード値とのマッピングについて詳しくは、『 Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド 』の flash.ui.Keyboard クラスの項を参照してください。

キーとキーコード間のマッピングは、デバイスやオペレーティングシステムによって異なります。 このため、キーマッピングを使用してアクションをトリガーしないでください。 代わりに、Keyboard クラスによって提供される事前定義された定数値を使って、適切な keyCode プロパティを参照します。例えば、Shift キーのキーマッピングを使用する代わりに、 Keyboard.SHIFT 定数を使用します(前のサンプルコードを参照)。

KeyboardEvent の優先度

他のイベントの場合と同様、キーボードイベントシーケンスは、コードで addEventListener() メソッドが割り当てられた順番ではなく、表示オブジェクト階層によって決定されます。

例えば、次の例に示すように、 tf というテキストフィールドを container というムービークリップ内に配置し、キーボードイベント用のイベントリスナーを両方のインスタンスに追加すると仮定します。

container.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
container.tf.border = true; 
container.tf.type = "input"; 
container.tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace(event.currentTarget.name + " hears key press: " +         String.fromCharCode(event.charCode) + " (key code: " +         event.keyCode + " character code: " + event.charCode + ")"); 
}

テキストフィールドとその親コンテナの両方にリスナーがあるため、 reportKeyDown() 関数は TextField 内でのキーストロークごとに 2 回呼び出されます。キーが押されるたびに、テキストフィールドの方が container ムービークリップより先にイベントを送出します。

オペレーティングシステムや Web ブラウザーは、Adobe Flash Player または AIR より先にキーボードイベントを処理します。例えば、Microsoft Internet Explorer では、Ctrl + W を押すと、表示されている SWF ファイルがキーボードイベントを送出する前に、ブラウザーウィンドウが閉じます。