Robotによる自動操縦とスクリーンキャプチャ取得

Javaアプリケーションでは、robotクラスの機能を使うことで、マウスカーソルやキー入力を操作して自動操縦を行ったり、画面上の任意の領域をスクリーンキャプチャしてスクリーンショットを取得することができます。

Robot

Robotクラスの使い方は簡単で、コンストラクタでオブジェクトを作ったら、操作対象やキャプチャする領域などをパラメータとしてメソッドに渡すだけです。主なメソッドは、以下のとおり。

createScreenCapture(Rectangle screenRect)
指定領域をキャプチャしてスクリーンショットのBufferedImageを返す

getPixelColor(int x, int y)
画面上の指定座標の色を返す

keyPress(int keycode)
keyRelease(int keycode)
指定キーの操作を行う

mouseMove(int x, int y)
マウスカーソルを指定位置に動かす

mousePress(int buttons)
mouseRelease(int buttons)
マウスボタンの操作を行う

mouseWheel(int wheelAmt)
マウスのホイールボタンを操作する

面白い、というかちょっとJavaらしくないのは、マウスのホイールボタン操作まであることですね。これらのメソッドを使うと、「(x, y)にマウスカーソルを移動し、その周囲128*128ピクセルのスクリーンショットを取得する」メソッドを以下のように記述できます。

  // (x, y)にマウスカーソルを移動し周辺のスクリーンキャプチャを返す
  private BufferedImage test(int x, int y) {

      Robot r = null;

      // Robotオブジェクト作成
      try {
          r = new Robot();
      } catch (Exception e) {
      }

      if (r == null) {
          return null;
      }

      // マウスカーソル移動
      r.mouseMove(x, y);

      int px = x - 64;
      int py = y - 64;

      if (px < 0) {
          px = 0;
      }

      if (py < 0) {
          py = 0;
      }

      // (px, py)から128*128ピクセルをスクリーンキャプチャし画像を返す
      return r.createScreenCapture(new Rectangle(px, py, 128, 128));

  }

ただ、ドキュメントを読むとセキュリティ関連の例外が起こる可能性があるようなので、環境によっては機能しないのかもしれません(アプレットでは、有効にすると「Webページを開いただけでスクリーンショットをサーバーに送信する」Javaアプレットを作成できることになりますから、まずいでしょうね)。また、マウスやキー入力の扱いとその影響は、当然プラットフォームや設定などによって違ってきます。自動操作を行うプログラムは、基本的に特定の環境で特定のアプリケーションを対象としたものになるでしょう。

プログラム

今回のサンプルプログラムは、Robotクラスを使って「(100, 100)にマウスカーソルを移動し、その周囲のスクリーンショットを表示する」ものです。実行したら、testボタンをクリックしてみてください。マウスカーソルが画面左上に移動し、マウスカーソル周辺のスクリーンショットが表示されます。

サンプルソース表示


プログラミング資料庫 > Javaプログラミング実験室