|
|||||
プログラムからマウスやキーボードを操作(動かす)するサンプル(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 |