2.マウス操作の自動化(SendInput 関数使用例)(37_Mos_02) (旧、SampleNo.352) |
1.マウス操作の自動化(SendInput 関数使用例) 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :Imports System.Runtime.InteropServices 参照設定:追加なし その他 : : このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.マウス操作の自動化(SendInput 関数使用例) |
Imports System.Runtime.InteropServices Public Class Form1 #Region "Win32 API 関数関係の宣言" 'SendInput 関数でマウス操作に関する動作等を指定する MOUSEINPUT 構造体 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Private Structure MOUSEINPUT Public dx As Integer 'マウス位置の指定座標 Public dy As Integer '絶対座標/相対座標で指定 Public mouseData As Integer 'ホイールの移動 Public dwFlags As Integer 'マウスの動作を指定するフラグを設定 Public time As Integer 'タイムスタンプ(このメンバーは無視されます) Public dwExtraInfo As IntPtr '追加情報(このメンバーは無視されます) End Structure 'SendInput 関数の設定に使用する INPUT 構造体 'type SendInput 関数の使用目的 0=マウス 1=キーボード 2=ハードウェア 'ki KEYBDINPUT 構造体 <StructLayout(LayoutKind.Sequential, Size:=28)> _ Private Structure INPUT Public type As Integer Public ki As MOUSEINPUT End Structure 'キーストローク、マウスの動き、ボタンのクリックなどを合成します。 ' nInputs 入力イベントの数 ' pInputs() 挿入する入力イベントの配列 ' cbsize 構造体のサイズ ' 戻り値 挿入することができたイベントの数を返す。 ' ブロックされている場合は 0 を返す <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ Private Shared Function SendInput( _ ByVal nInputs As Integer, _ ByVal pInputs() As INPUT, _ ByVal cbsize As Integer) As Integer End Function 'マウス操作を設定する為の自作構造体 'mx 'マウスのX座標を指定 'my 'マウスのY座標を指定 'mFrg 'マウスの動作を指定(下記の定数等) <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Private Structure MOEVENTS Public mx As Integer Public my As Integer Public mFrg As Integer End Structure Private Const INPUT_MOUSE As Integer = 0 Private Const MOUSE_MOVED As Integer = &H1 'マウスを移動する Private Const MOUSEEVENTF_ABSOLUTE As Integer = &H8000& '移動時、絶対座標を指定 Private Const MOUSEEVENTF_XDOWN As Integer = &H100 'X ボタンDown Private Const MOUSEEVENTF_XUP As Integer = &H200 'X ボタンUP Private Const MOUSEEVENTF_WHEEL As Integer = &H80 'ホイールが回転したことを示し、移動量は 'mouseData パラメーターで指定 Private Const MOUSEEVENTF_LEFTUP As Integer = &H4 '左ボタンUP Private Const MOUSEEVENTF_LEFTDOWN As Integer = &H2 '左ボタンDown Private Const MOUSEEVENTF_MIDDLEDOWN As Integer = &H20 '中央ボタンDown Private Const MOUSEEVENTF_MIDDLEUP As Integer = &H40 '中央ボタンUP Private Const MOUSEEVENTF_RIGHTDOWN As Integer = &H8 '右ボタンDown Private Const MOUSEEVENTF_RIGHTUP As Integer = &H10 '右ボタンUP Private sPos As Point #End Region #Region "自作関数(SedMouseInput 他)の実行部分" Private Function SedMouseInput(ByVal MEs() As MOEVENTS) As Integer Dim eventN As Integer = MEs.GetUpperBound(0) Dim arrayINPUT(eventN) As INPUT SedMouseInput = 0 For i As Integer = 0 To eventN arrayINPUT(i).type = INPUT_MOUSE With arrayINPUT(i).ki .dx = MEs(i).mx 'マウスの移動時のX方向への移動量 .dy = MEs(i).my 'マウスの移動時のY方向への移動量 .mouseData = 0 '必要としません .dwFlags = MEs(i).mFrg 'マウスイベント .time = 0 'デフォルトの設定 .dwExtraInfo = IntPtr.Zero '必要としません End With Next '関数の実行(連続でマウスの操作を実施)'個々のマウスの操作の間に割り込みが入らない。 SendInput(arrayINPUT.Length, arrayINPUT, Marshal.SizeOf(GetType(INPUT))) End Function Private Function GetMiddleCenter(ByVal ctl As Control) As Point 'コントロールの中央の絶対座標(スクリーン座標)を求める Dim Cpos As Point = ctl.ClientRectangle.Location Dim Spos As Point = ctl.PointToScreen(Cpos) Dim po As Point po.X = Spos.X + (ctl.Width \ 2) - 2 po.Y = Spos.Y + (ctl.Height \ 2) - 2 Return po End Function Private Function MouMovedPos(ByVal pos As Point) As Point '実際にマウスを移動させる為の補正値を求める '画面の解像度を取得 Dim dX As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim dY As Integer = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height Dim po As Point 'マウスの移動量を計算(絶対位置) po.X = CInt(pos.X * (65535 / dX)) po.Y = CInt(pos.Y * (65535 / dY)) Return po End Function #End Region #Region "本文関係の処理" Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MessageBox.Show("Button1 がクリックされました。") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '--------------- 基本操作部分 --------------- 'コマンドボタンのスクリーン座標を取得 Dim pos1 As Point = GetMiddleCenter(Button1) 'Button1 の中央の絶対座標を求める(★自作関数) Dim po As Point = MouMovedPos(pos1) '上記へ移動する為の補正値(★自作関数) Dim MEs() As MOEVENTS 'マウス操作を設定する為の構造体 ReDim Preserve MEs(2) '上記を配列で使用 MEs(0).mx = po.X : MEs(0).my = po.Y 'マウスカーソルの移動先 MEs(0).mFrg = MOUSE_MOVED Or MOUSEEVENTF_ABSOLUTE 'マウスを絶対座標位置へ移動 MEs(1).mFrg = MOUSEEVENTF_LEFTDOWN 'マウスの左ボタンを押す MEs(2).mFrg = MOUSEEVENTF_LEFTUP 'マウスの左ボタンを離す '--------------- 追加操作部分 --------------- sPos = Cursor.Position 'このボタンをクリックした位置座標 po = MouMovedPos(sPos) '上記へ移動する為の補正値(★自作関数) ReDim Preserve MEs(3) MEs(3).mx = po.X : MEs(3).my = po.Y 'マウスカーソルの移動先 MEs(3).mFrg = MOUSE_MOVED Or MOUSEEVENTF_ABSOLUTE 'マウスを絶対座標位置へ移動 '-------------------------------------------- '関数の実行(Button1 の中央に移動し、クリックし、元の位置に戻る) Call SedMouseInput(MEs) End Sub #End Region End Class 下記のサンプルもご覧下さい。 http://hanatyan.sakura.ne.jp/patio/read.cgi?no=246 http://hanatyan.sakura.ne.jp/patio/read.cgi?no=315 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
1.マウス操作の自動化 2.コントロールの中央の絶対座標(スクリーン座標)を求める関数(フォーム上のコントロールのスクリーン座標を求める) 3.実際にマウスを移動させる為の補正値を求める関数 |