2007 年 1 月 30 日 23 時 56 分

キー入力の分析


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日はキー入力を解析してみよう。

実行し、「Key$」と入力してみた。

jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=65505]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=75]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=75]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=65505]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=101]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=101]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=121]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=121]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=65505]
jp.loafer.rfb.message.client.KeyEventMessage[down=true,code=36]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=36]
jp.loafer.rfb.message.client.KeyEventMessage[down=false,code=65505]

KeyEventMessage のパラメータは、
down と code の 2 つだけなので、
その内容は至って単純に見えるが、
以前、KeyEvent メッセージの項でも述べたが、
RFB のキーメッセージは、低水準と高水準が混ざっている。

http://mixi.jp/view_diary.pl?id=311587157&owner_id=2300658

テストでは、「K」の入力で以下のメッセージが流れた。

・左 Shift 押す [down=true,code=65505]
・A キー押す [down=true,code=75]
・A キー離す [down=true,code=75]
・左 Shift 離す [down=false,code=65505]

キーメッセージの down は、常に低水準である。
低水準というのは、キーの上下運動を示しており、
押されたのか離されたのかが分かるようになっている。

code は、押されたキーの仮想キーコードだが、
文字キーを入力した場合のみ、キーのコードではなく、
高水準の実際の文字を表す文字コードとなる。

これは、code が 0xFF## かどうかで調べることができる。
65505 は「左のシフトキー」の仮想キーコードだが、
75 は、「大文字 A」の ASCII 文字コードであり、
「A・ち が印字されたキー」の仮想キーコードではない。

続く「e」「y」の入力は以下の通り。

・E キー押す [down=true,code=101]
・E キー離す [down=false,code=101]
・Y キー押す [down=true,code=121]
・Y キー離す [down=false,code=121]

101 は、「小文字 e」の ASCII 文字コード、
121 は、「小文字 y」の ASCII 文字コードである。

最後の「$」の入力は以下の通り。

・左 Shift 押す [down=true,code=65505]
・4 キー押す [down=true,code=36]
・4 キー離す [down=false,code=36]
・左 Shift 離す [down=false,code=65505]

KeyEventMessage[down=true,code=65505]
KeyEventMessage[down=true,code=36]
KeyEventMessage[down=false,code=36]
KeyEventMessage[down=false,code=65505]

65505 は、「左のシフトキー」の仮想キーコード、
36 は、「記号 $」の ASCII 文字コードである。

AWT でキー入力を処理する場合、
KeyListener によるイベント通知を使うのだが、
これは keyPressed、keyReleased、keyTyped に分かれている。

keyPressed、keyReleased は低水準キー入力イベント、
keyTyped は、高水準文字入力イベントである。

通常、高水準イベントは低水準イベントを元に生成するが、
RFB のキーイベントを AWT 式にマッピングするためには、
RFB によって合成されている高水準文字コードを元に、
低水準の仮想キーコードイベントを合成する必要がある。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.