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が発生する。一体なにが起きているのだろう。