VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 マウス関係のメニュー
1.マウスに関する操作色々
2.マウス操作の自動化(SendInput 関数使用例)
3.マウスのドラッグでコントロールを移動
4.マウスのドラッグで範囲選択枠をトップレベルで表示
5.
6.
7.
8.
9.
10.
11.
12.
 .
20.その他、当サイト内に掲載のマウスに関するサンプル


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.実際にマウスを移動させる為の補正値を求める関数



このページのトップへ移動します。