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が押されましたよ」メッセージボックスが出てきたら成功.