NonSoft

マウス操作やキーボード操作をシミュレーション
するサンプル(VB.NET)


 サンプル(ソース/コード)
プログラムからマウスやキーボードを操作(動かす)するサンプル(VB.NET)です。

毎日、同じ操作を繰り返す時などは、パソコンが自動で動いて欲しいものです。

このサンプルは、、、
あたかも人間がパソコンを操作しているような擬似操作プログラムを作る時に役立つと思います。

関連ツールはこちらです。
WEB操作再生ツール(WebRecPlay)

C#.NETのサンプルはこちらです。
マウス操作やキーボード操作をシミュレーションするサンプル(C#.NET)

その他のサンプルはこちらです。
サンプルソース(コード)

★フォーム(Form1.vb)
Imports System.Runtime.InteropServices

Public Class Form1
    ' マウスイベント(mouse_eventの引数と同様のデータ)
    <StructLayout(LayoutKind.Sequential)> _
    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 Integer
    End Structure

    ' キーボードイベント(keybd_eventの引数と同様のデータ)
    <StructLayout(LayoutKind.Sequential)> _
    Private Structure KEYBDINPUT
        Public wVk As Short
        Public wScan As Short
        Public dwFlags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Structure

    ' ハードウェアイベント
    <StructLayout(LayoutKind.Sequential)> _
    Private Structure HARDWAREINPUT
        Public uMsg As Integer
        Public wParamL As Short
        Public wParamH As Short
    End Structure

    ' 各種イベント(SendInputの引数データ)
    <StructLayout(LayoutKind.Explicit)> _
    Private Structure INPUT
        <FieldOffset(0)> Public type As Integer
        <FieldOffset(4)> Public mi As MOUSEINPUT
        <FieldOffset(4)> Public ki As KEYBDINPUT
        <FieldOffset(4)> Public hi As HARDWAREINPUT
    End Structure

    ' キー操作、マウス操作をシミュレート(擬似的に操作する)
    <DllImport("user32.dll")> _
    Private Shared Sub SendInput( _
        ByVal nInputs As Integer, ByRef pInputs As INPUT, ByVal cbsize As Integer)
    End Sub

    ' 仮想キーコードをスキャンコードに変換
    <DllImport("user32.dll", EntryPoint:="MapVirtualKeyA")> _
    Private Shared Function MapVirtualKey( _
        ByVal wCode As Integer, ByVal wMapType As Integer) As Integer
    End Function

    Private Const INPUT_MOUSE = 0                   ' マウスイベント
    Private Const INPUT_KEYBOARD = 1                ' キーボードイベント
    Private Const INPUT_HARDWARE = 2                ' ハードウェアイベント

    Private Const MOUSEEVENTF_MOVE = &H1            ' マウスを移動する
    Private Const MOUSEEVENTF_ABSOLUTE = &H8000     ' 絶対座標指定
    Private Const MOUSEEVENTF_LEFTDOWN = &H2        ' 左 ボタンを押す
    Private Const MOUSEEVENTF_LEFTUP = &H4          ' 左 ボタンを離す
    Private Const MOUSEEVENTF_RIGHTDOWN = &H8       ' 右 ボタンを押す
    Private Const MOUSEEVENTF_RIGHTUP = &H10        ' 右 ボタンを離す
    Private Const MOUSEEVENTF_MIDDLEDOWN = &H20     ' 中央ボタンを押す
    Private Const MOUSEEVENTF_MIDDLEUP = &H40       ' 中央ボタンを離す
    Private Const MOUSEEVENTF_WHEEL = &H800         ' ホイールを回転する
    Private Const WHEEL_DELTA = 120                 ' ホイール回転値

    Private Const KEYEVENTF_KEYDOWN = &H0           ' キーを押す
    Private Const KEYEVENTF_KEYUP = &H2             ' キーを離す
    Private Const KEYEVENTF_EXTENDEDKEY = &H1       ' 拡張コード
    Private Const VK_SHIFT = &H10                   ' SHIFTキー

    ' マウスの右ボタンをクリックする
    Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 自ウインドウを非表示(マウス操作対象のウィンドウへフォーカスを移動するため)
        Me.Visible = False

        ' マウス操作実行用のデータ
        Const num As Integer = 3
        Dim inp As INPUT() = New INPUT(num - 1) {}

        ' (1)マウスカーソルを移動する(スクリーン座標でX座標=800ピクセル,Y=400ピクセルの位置)
        inp(0).type = INPUT_MOUSE
        inp(0).mi.dwFlags = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
        inp(0).mi.dx = 800 * (65535 / Screen.PrimaryScreen.Bounds.Width)
        inp(0).mi.dy = 400 * (65535 / Screen.PrimaryScreen.Bounds.Height)
        inp(0).mi.mouseData = 0
        inp(0).mi.dwExtraInfo = 0
        inp(0).mi.time = 0

        ' (2)マウスの右ボタンを押す
        inp(1).type = INPUT_MOUSE
        inp(1).mi.dwFlags = MOUSEEVENTF_RIGHTDOWN
        inp(1).mi.dx = 0
        inp(1).mi.dy = 0
        inp(1).mi.mouseData = 0
        inp(1).mi.dwExtraInfo = 0
        inp(1).mi.time = 0

        ' (3)マウスの右ボタンを離す
        inp(2).type = INPUT_MOUSE
        inp(2).mi.dwFlags = MOUSEEVENTF_RIGHTUP
        inp(2).mi.dx = 0
        inp(2).mi.dy = 0
        inp(2).mi.mouseData = 0
        inp(2).mi.dwExtraInfo = 0
        inp(2).mi.time = 0

        ' マウス操作実行
        SendInput(num, inp(0), Marshal.SizeOf(inp(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' 自ウインドウを表示
        Me.Visible = True
    End Sub

    ' マウスの左ボタンをダブルクリックする
    Private Sub Button2_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' 自ウインドウを非表示(マウス操作対象のウィンドウへフォーカスを移動するため)
        Me.Visible = False

        ' マウス操作実行用のデータ
        Const num As Integer = 5
        Dim inp As INPUT() = New INPUT(num - 1) {}

        ' (1)マウスカーソルを移動する(スクリーン座標でX座標=800ピクセル,Y=400ピクセルの位置)
        inp(0).type = INPUT_MOUSE
        inp(0).mi.dwFlags = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
        inp(0).mi.dx = 800 * (65535 / Screen.PrimaryScreen.Bounds.Width)
        inp(0).mi.dy = 400 * (65535 / Screen.PrimaryScreen.Bounds.Height)
        inp(0).mi.mouseData = 0
        inp(0).mi.dwExtraInfo = 0
        inp(0).mi.time = 0

        ' (2)マウスの左ボタンを押す
        inp(1).type = INPUT_MOUSE
        inp(1).mi.dwFlags = MOUSEEVENTF_LEFTDOWN
        inp(1).mi.dx = 0
        inp(1).mi.dy = 0
        inp(1).mi.mouseData = 0
        inp(1).mi.dwExtraInfo = 0
        inp(1).mi.time = 0

        ' (3)マウスの左ボタンを離す
        inp(2).type = INPUT_MOUSE
        inp(2).mi.dwFlags = MOUSEEVENTF_LEFTUP
        inp(2).mi.dx = 0
        inp(2).mi.dy = 0
        inp(2).mi.mouseData = 0
        inp(2).mi.dwExtraInfo = 0
        inp(2).mi.time = 0

        ' (4)マウスの左ボタンを押す
        inp(3).type = INPUT_MOUSE
        inp(3).mi.dwFlags = MOUSEEVENTF_LEFTDOWN
        inp(3).mi.dx = 0
        inp(3).mi.dy = 0
        inp(3).mi.mouseData = 0
        inp(3).mi.dwExtraInfo = 0
        inp(3).mi.time = 0

        ' (5)マウスの左ボタンを離す
        inp(4).type = INPUT_MOUSE
        inp(4).mi.dwFlags = MOUSEEVENTF_LEFTUP
        inp(4).mi.dx = 0
        inp(4).mi.dy = 0
        inp(4).mi.mouseData = 0
        inp(4).mi.dwExtraInfo = 0
        inp(4).mi.time = 0

        ' マウス操作実行
        SendInput(num, inp(0), Marshal.SizeOf(inp(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' 自ウインドウを表示
        Me.Visible = True
    End Sub

    ' マウスの中央ボタンをクリックする
    Private Sub Button3_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ' 自ウインドウを非表示(マウス操作対象のウィンドウへフォーカスを移動するため)
        Me.Visible = False

        ' マウス操作実行用のデータ
        Const num As Integer = 3
        Dim inp As INPUT() = New INPUT(num - 1) {}

        ' (1)マウスカーソルを移動する(スクリーン座標でX座標=800ピクセル,Y=400ピクセルの位置)
        inp(0).type = INPUT_MOUSE
        inp(0).mi.dwFlags = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
        inp(0).mi.dx = 800 * (65535 / Screen.PrimaryScreen.Bounds.Width)
        inp(0).mi.dy = 400 * (65535 / Screen.PrimaryScreen.Bounds.Height)
        inp(0).mi.mouseData = 0
        inp(0).mi.dwExtraInfo = 0
        inp(0).mi.time = 0

        ' (2)マウスの中央ボタンを押す
        inp(1).type = INPUT_MOUSE
        inp(1).mi.dwFlags = MOUSEEVENTF_MIDDLEDOWN
        inp(1).mi.dx = 0
        inp(1).mi.dy = 0
        inp(1).mi.mouseData = 0
        inp(1).mi.dwExtraInfo = 0
        inp(1).mi.time = 0

        ' (3)マウスの中央ボタンを離す
        inp(2).type = INPUT_MOUSE
        inp(2).mi.dwFlags = MOUSEEVENTF_MIDDLEUP
        inp(2).mi.dx = 0
        inp(2).mi.dy = 0
        inp(2).mi.mouseData = 0
        inp(2).mi.dwExtraInfo = 0
        inp(2).mi.time = 0

        ' マウス操作実行
        SendInput(num, inp(0), Marshal.SizeOf(inp(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' 自ウインドウを表示
        Me.Visible = True
    End Sub

    ' マウスホイールを回転する
    Private Sub Button4_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ' 自ウインドウを非表示(マウス操作対象のウィンドウへフォーカスを移動するため)
        Me.Visible = False

        ' マウス操作実行用のデータ
        Const num As Integer = 2
        Dim inp As INPUT() = New INPUT(num - 1) {}

        ' (1)マウスカーソルを移動する(スクリーン座標でX座標=800ピクセル,Y=400ピクセルの位置)
        inp(0).type = INPUT_MOUSE
        inp(0).mi.dwFlags = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
        inp(0).mi.dx = 800 * (65535 / Screen.PrimaryScreen.Bounds.Width)
        inp(0).mi.dy = 400 * (65535 / Screen.PrimaryScreen.Bounds.Height)
        inp(0).mi.mouseData = 0
        inp(0).mi.dwExtraInfo = 0
        inp(0).mi.time = 0

        ' (2)マウスホイールを前方(近づく方向)へ回転する
        inp(1).type = INPUT_MOUSE
        inp(1).mi.dwFlags = MOUSEEVENTF_WHEEL
        inp(1).mi.dx = 0
        inp(1).mi.dy = 0
        inp(1).mi.mouseData = -1 * WHEEL_DELTA
        inp(1).mi.dwExtraInfo = 0
        inp(1).mi.time = 0

        ' マウス操作実行
        SendInput(num, inp(0), Marshal.SizeOf(inp(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' マウス操作実行用のデータ
        Const nu2 As Integer = 1
        Dim in2 As INPUT() = New INPUT(num - 1) {}

        ' (1)マウスホイールを後方(離れる方向)へ回転する
        in2(0).type = INPUT_MOUSE
        in2(0).mi.dwFlags = MOUSEEVENTF_WHEEL
        in2(0).mi.dx = 0
        in2(0).mi.dy = 0
        in2(0).mi.mouseData = +1 * WHEEL_DELTA
        in2(0).mi.dwExtraInfo = 0
        in2(0).mi.time = 0

        ' マウス操作実行
        SendInput(nu2, in2(0), Marshal.SizeOf(in2(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' 自ウインドウを表示
        Me.Visible = True
    End Sub

    ' キーボードを押す
    Private Sub Button5_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        ' 自ウインドウを非表示(キーボード操作対象のウィンドウへフォーカスを移動するため)
        Me.Visible = False

        ' キーボード操作実行用のデータ
        Const num As Integer = 4
        Dim inp As INPUT() = New INPUT(num - 1) {}

        ' (1)キーボード(SHIFT)を押す
        inp(0).type = INPUT_KEYBOARD
        inp(0).ki.wVk = VK_SHIFT
        inp(0).ki.wScan = MapVirtualKey(inp(0).ki.wVk, 0)
        inp(0).ki.dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN
        inp(0).ki.dwExtraInfo = 0
        inp(0).ki.time = 0

        ' (2)キーボード(A)を押す
        inp(1).type = INPUT_KEYBOARD
        inp(1).ki.wVk = Keys.A
        inp(1).ki.wScan = MapVirtualKey(inp(1).ki.wVk, 0)
        inp(1).ki.dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN
        inp(1).ki.dwExtraInfo = 0
        inp(1).ki.time = 0

        ' (3)キーボード(A)を離す
        inp(2).type = INPUT_KEYBOARD
        inp(2).ki.wVk = Keys.A
        inp(2).ki.wScan = MapVirtualKey(inp(2).ki.wVk, 0)
        inp(2).ki.dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
        inp(2).ki.dwExtraInfo = 0
        inp(2).ki.time = 0

        ' (4)キーボード(SHIFT)を離す
        inp(3).type = INPUT_KEYBOARD
        inp(3).ki.wVk = VK_SHIFT
        inp(3).ki.wScan = MapVirtualKey(inp(3).ki.wVk, 0)
        inp(3).ki.dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
        inp(3).ki.dwExtraInfo = 0
        inp(3).ki.time = 0

        ' キーボード操作実行
        SendInput(num, inp(0), Marshal.SizeOf(inp(0)))

        ' 1000ミリ秒スリープ
        System.Threading.Thread.Sleep(1000)

        ' 自ウインドウを表示
        Me.Visible = True
    End Sub
End Class