java
1import java.awt.Frame;
2import java.awt.Label;
3import java.awt.event.KeyAdapter;
4import java.awt.event.KeyEvent;
5import java.awt.event.WindowAdapter;
6import java.awt.event.WindowEvent;
7
8public class KeyIntervalWatcher extends Frame {
9 private long oldTime; // 前回キー入力時刻
10 public KeyIntervalWatcher() {
11 super("KeyIntervalWatcher");
12 setSize(400, 200);
13 add(new Label("press any key"));
14
15 oldTime = System.currentTimeMillis(); //現在時刻(ミリ秒)取得
16
17 // キー入力イベントを受け取る
18 addKeyListener(new KeyAdapter() {
19 public void keyPressed(KeyEvent e) {
20 System.out.printf("%c ... %d\n",
21 e.getKeyChar(), //キー文字
22 e.getWhen()-oldTime); //イベント発生時刻から間隔を算出
23 oldTime = e.getWhen();
24 }
25 });
26
27 // ウィンドウを閉じると終了
28 addWindowListener(new WindowAdapter() {
29 public void windowClosing(WindowEvent e) {
30 System.exit(0);
31 }
32 });
33 }
34 public static void main(String[] args) {
35 new KeyIntervalWatcher().setVisible(true);
36 }
37}
アルゴリズムはさておき、キーの入力間隔をミリ秒単位でコンソールに出力する
プログラムです。考え方はこんな感じになるのではないでしょうか。
(AWT!?というつっこみは無しで・・・)
しかしひとつ懸念があります。Javaの標準APIだけでこれらをやろうとした場合、
1文字ごとにキーイベントを受け取るには javax.swing か java.awt といった
GUIライブラリを使う必要があります。(コンソールは行単位なので)
このライブラリは画面の描画やイベントの伝搬なども担うため、キー入力以外
にもいろいろ処理することがあって忙しく、キーを押した時刻は取得できても
それが認証に耐えうるようなレベルで正確なのかは分かりません。
Javaはやめて、もっと低レベルなAPI(OS寄りの)で考えたほうが良いのでは
ないでしょうか。
なるべくダイレクトにキー入力を取得するという意味では、SDLやDirectX
といったゲーム用ライブラリが意外に使えるかもしれません。