C#で指定した位置をクリックする

マウスの移動とクリック

マウスの移動にはSetCursorPos関数,クリックにはmouse_event関数を使う.

どちらの関数もUSER32.dllに実装されているため,DllImport属性を使用して宣言する.DllImport属性は,System.Runtime.InteropServices名前空間にあるのでusing宣言しておく.

using System.Runtime.InteropServices;
[DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
static extern void SetCursorPos(int X, int Y);

[DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

SetCursorPos関数は,引数X,Yで指定されたスクリーン座標へマウスカーソルを移動させる.

mouse_event関数は,マウスの移動やマウスボタンのクリックを合成する.引数のdwFlagsによって様々な動作を指定できるようだが,今回はクリックするだけなので,左ボタンのイベントであるMOUSEEVENTF_LEFTDOWNおよびMOUSEEVENTF_LEFTUPのみ使用.

MOUSEEVENTF_LEFTDOWNとMOUSEEVENTF_LEFTUPを指定するための値を以下のように宣言する.

private const int MOUSEEVENTF_LEFTDOWN = 0x2;
private const int MOUSEEVENTF_LEFTUP = 0x4;

各イベントの値と意味は下記ページを参照.(MSDNの日本語版と英語版だけど,値はなぜか英語版にしか載ってない...)
http://msdn.microsoft.com/ja-jp/library/cc410921.aspx
http://msdn.microsoft.com/ja-jp/library/windows/desktop/ms646260(v=vs.85).aspx

動作確認

動作を確認するために,button1をクリックしたらbutton2がクリックされるプログラムを作った.

// button1のクリックイベント
private void button1_Click(object sender, EventArgs e)
{
    var point = button2.Parent.PointToScreen(button2.Location); // button2の座標取得
    SetCursorPos(point.X, point.Y);                             // button2へ移動
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);              // マウスの左ボタンダウンイベントを発生させる
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);                // マウスの左ボタンアップイベントを発生させる
}

// button2のクリックイベント
private void button2_Click(object sender, EventArgs e)
{
    MessageBox.Show("button2が押されましたよ");
}

button1をクリックして,「button2が押されましたよ」メッセージボックスが出てきたら成功.