ソフト開発

Windowsの自動操作にチャレンジ! – マウスを動かしてみよう

最近は、RPAなどの自動化ツールでパソコンなどの操作を自動化するツールが出てきています。
RPAでは様々な種類があり、簡単に様々な操作ができるようになっていますが、ここでは、Microsoft Visual C#を使用して簡単な自動操作について、複数回に渡り、実験をしていきたいと思います。

今回すること

まず、今回は、マウスの操作をやってみようと思います。
通常、マウスカーソルは、マウスの動きによって動作しています。
これを、マウスを操作しなくても、ソフトから操作して動作させようというものです。

マウスカーソルの動かし方

マウスカーソルをソフトから操作することは、.NET Frameworkに用意されているクラスで簡単にできるようになっています。

マウスの座標を取得、または設定するには、下記のCursorクラスのPositionプロパティが使用できます。

point Cursor.Position

このプロパティはpoint型なので、pointクラスで座標を指定します。

// マウス座標指定
System.Windows.Forms.Cursor.Position = new System.Drawing.Point(X, Y);
※X⇒マウスのX座標、Y⇒マウスのY座標

これだけで、目的の座標にマウスを移動できます。
しかし、現在の座標から、目的の座標までは、マウスを手で操作するのとは違い、目的座標までテレポートしてしまいます。

それでも、問題ないとは思いますが、人が動かしているようにマウスカーソルを動かしたいと思います。
そのためには、現在のマウスカーソル座標を読み取り、目的座標までの軌跡を順番に移動しないといけません。

マウスカーソルの座標取得

現在のマウスカーソルの座標取得ですが、これも非常に簡単で、先ほどのプロパティで取得可能です。
ただし、Cursor.Positionにさらにプロパティがあり、XとYをint型で取得できます。

// マウス座標取得
int iX = System.Windows.Forms.Cursor.Position.X;
int iY = System.Windows.Forms.Cursor.Position.Y;

これで、現在のマウスカーソル座標が分かりました。

次は、目的座標までの移動量と傾きが必要です。

目的座標までの移動

目的座標までの移動方法としては、3種類あると思います。
1つめは、途中の軌跡をたどらない(瞬時にして目的座標にマウスカーソルを表示)。
しかし、この方法は、瞬間的に移動するため、先ほどの目的に合いません。
もう一つは、直線で結ぶ方法(1)、最後は、2段階移動(2)です。

人の手で操作している感じを出すには、(1)の直線で移動する方が良いと思います。
そのためには、現在座標から目的座標までのX,Yそれぞれの増分値を求めて、ループで目的座標まで繰り返します。

// 目的位置までの移動量
if(Math.Abs(iTarX – iCurX) > Math.Abs(iTarY – iCurY)){
iLen = iTarX – iCurX;
dIx = iLen / Math.Abs(iLen);
dIy = (double)(iTarY – iCurY) / (double)Math.Abs(iTarX – iCurX);
} else {
iLen = iTarY – iCurY;
dIx = (double)(iTarX – iCurX) / (double)Math.Abs(iTarY – iCurY);
dIy = iLen / Math.Abs(iLen);
}

現在座標が、iCurX, iCurY、目的座標が、iTarX, iTarYです。
X,Yそれぞれの増分値が、dIx, dIyで、距離が、iLenになります。
iLenだけ、iCurXとiCurYをdIx, dIyずつ加算していきます。

// マウス移動
for(int iLop = 0; iLop < Math.Abs(iLen); iLop++){
System.Windows.Forms.Cursor.Position = new System.Drawing.Point(iCurX + (int)((double)iLop * dIx), iCurY + (int)((double)iLop * dIy));
System.Threading.Thread.Sleep(10);
}
// 最終的に目的位置に設定
System.Windows.Forms.Cursor.Position = new System.Drawing.Point(iTarX, iTarY);

ループの最後には、マウスカーソルを目的座標に移動します。
これは、増分値の加算で誤差が出ているため、最後は座標を合わせるためです。

実際に動作させてみる

プロジェクトをビルドして、実行してみました。

マウスカーソルを右の方に移動して、その座標を入力します。
その後、開始ボタンで先ほどの処理を実行して、マウスカーソルを目的の座標まで移動します。

次回

今回はマウスの移動まで出来ました。
次回は、マウスのクリックやドラッグが出来たらと思います。
最終的には、簡単なRPAもどきのようなものが出来れば良いですね。

今回のサンプルプロジェクトは、下記からダウンロードできます。
試してみてください!