tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
マウス操作の自動化(SendInput 関数使用例) (VB.NET) ( No.0 )  [親スレッドへ]
日時: 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

 画像をクリックすると元のサイズで見る事ができます。



 [スレッド一覧へ] [親スレッドへ]