- 日時: 2012/02/13 16:03
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[マウス][][] * * キーワード:マウス操作,mouse_event,マウスジェスチャー,マウスクリック,SendInput * *********************************************************************************** タイトル :マウス操作の自動化(SendInput 関数使用例) SampleNo :352 投 稿 日 :2009/12/25 投 稿 者 :花ちゃん ----------------------------------------------------------------------------------- 下記のNo.5 No.7 で、魔界の仮面弁士 さんに .NET での SendInput 関数の使い方を教えて 頂いて、動作確認できましたのでここへ投稿しておきます。 http://www.hanatyan.sakura.ne.jp/yybbs/read.cgi?no=79
尚、サンプルは、関数の動作を確認する為にカーソル移動・ボタンをクリックしておりますが その事が目的ではありませんので誤解無き様願います。
------------------------------------------------------------------------------------ 使用するコントロールは、下図を参照に適当に配置して下さい。
'=================================================================================================== 'SampleNo:352 2009.12.19 @ 2009.12.19 'タイトル:マウス操作の自動化(SendInput 関数使用例)(352) - VB2008 '動作確認:WindowsVista VB2008(EE) Framework 3.5 '[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定 '--------------------------------------------------------------------------------------------------- 'ソースコードは、保存オプションの詳細設定で、日本語(シフトJIS)-コードページ932 で保存しております。 'コードを折りたたむ方法と展開する方法 - #035 'http://blogs.msdn.com/vstipsjpn/archive/2008/05/22/8386191.aspx '[ツール] メニューの [オプション] をクリックし、[テキスト エディタ] の [Basic]の[VB固有] ページで、 '[アウトラインモードを有効にする] チェック ボックスをオフにして頂くと見易いかと。 '========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
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 'ホイールが回転したことを示し、 '移動量は、dwData パラメータで指定 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 "マウスの操作の指示部分の設定"
Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.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
#Region "自作関数(SedMouseInput 他)の実行部分"
Private Function SedMouseInput(ByVal MEs() As MoEvents) As Integer Dim eventN As Integer = MEs.GetUpperBound(0) Dim arrayINPUT(eventN) As INPUT 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 "Button1_Click イベント他"
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show("Button1 がクリックされました。") End Sub
#End Region
End Class
画像をクリックすると元のサイズで見る事ができます。
|