We are the Robot

JavaにはRobotクラスというキーボードやマウスオペレーションを人間の代わりに実行してくれるクラスがある。本来はテストの自動化のために用意されたらしいのだが、非常に便利なのでそれだけの用途では勿体無い。

例えばWindowsのクリップボード操作(切り取り、コピー、貼り付け)の処理をGUIコントロールに依らない透過なロジックで書こうとすると結構面倒なので、国際化を意識しない、一般的なテキストの入出力だけに限った場合、.NET WindowFormsはSendKeysで書いてしまうことが多い。

// クリップボードにコピー
SendKeys.Send("^C"); ※

JavaにはSendKeysクラスはないしましてやSendInputを呼ぶこともできないが、冒頭で紹介したRobotクラスを使えば同じことができる。

try {
    int key = KeyEvent.VK_C;
    int modifier = KeyEvent.VK_CONTROL;
    Robot bot = new Robot();

    bot.keyPress(modifier);
    bot.keyPress(key);
    bot.keyRelease(key);
    bot.keyRelease(modifier);
} catch (AWTException e) {
    //NOOP
}

ちなみにこの処理は特定のショートカットを入力するのでO/S依存となるだろう。マルチプラットホーム向けのアプリケーションではこのように書くのは駄目かもしれない。

※今までは無意識で書いていたので気がつかなかったが、"^C"を"^c"と小文字でSendを実行するとNullReferenceExceptionが発生する。一体なにが起きているのだろう。