3.SendInput 関数を使ってプログラム上からキーボードを操作する(12_Key_03) (旧、SampleNo.351) |
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 :System.Runtime.InteropServices 参照設定:追加なし その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :使用するコントロールは、下図を参照に適当に配置して下さい。 このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
|
1.SendInput 関数を使ってプログラム上からキーボードを操作する |
下記のNo.5 No.7 で、魔界の仮面弁士 さんに .NET での SendInput 関数の使い方を教えて頂いて、動作確認できましたのでここへ投稿しておきます。 http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=79 尚、サンプルは、関数の動作を確認する為にテキストボックスに文字を入力しておりますがその事が目的ではありませんので誤解無き様願います。 Imports System.Runtime.InteropServices Public Class Form1 #Region "本文関係の処理(Button_Click イベントの処理等)" Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click TextBox1.Focus() Dim wKey() As keyEvents 'キーボード操作を設定する為の構造体 ReDim Preserve wKey(7) '上記を配列で使用 wKey(0).kCode = Keys.A : wKey(0).kFrg = 0 'A キーダウン wKey(1).kCode = Keys.A : wKey(1).kFrg = 1 'A キーアップ wKey(2).kCode = Keys.B : wKey(2).kFrg = 0 'B キーダウン wKey(3).kCode = Keys.B : wKey(3).kFrg = 1 'B キーアップ wKey(4).kCode = Keys.Tab : wKey(4).kFrg = 0 'TAB キーダウン wKey(5).kCode = Keys.Tab : wKey(5).kFrg = 1 'TAB キーアップ wKey(6).kCode = Keys.C : wKey(6).kFrg = 0 'C キーダウン wKey(7).kCode = Keys.C : wKey(7).kFrg = 1 'C キーアップ Call SedKeyInput(wKey) End Sub Private Function SedKeyInput(ByVal wkey() As keyEvents) As Integer SedKeyInput = 0 Dim eventN As Integer = wkey.GetUpperBound(0) Dim arrayINPUT(eventN) As INPUT For i As Integer = 0 To eventN 'キーの操作回数分 arrayINPUT(i).type = INPUT_KEYBOARD 'キーボードイベントを設定(定数=1) With arrayINPUT(i).ki .wVk = CShort(wkey(i).kCode) 'キーコードを指定 .wScan = CShort(MapVirtualKey(wkey(i).kCode, 0)) 'スキャンコードを指定 If wkey(i).kFrg = 0 Then .dwFlags = dwFlag1 'キーダウン Else .dwFlags = dwFlag3 'キーアップ End If .time = 0 '無視 .dwExtraInfo = IntPtr.Zero '無視 End With Next '関数の実行(連続でキーを入力)'個々のキー入力の間に割り込みが入らない。 SendInput(arrayINPUT.Length, arrayINPUT, Marshal.SizeOf(GetType(INPUT))) End Function #End Region #Region "付帯処理関係(関数・メソッド及びWin32 API 関数の宣言及び変数の宣言等含む)" 'SendInput 関数でキー操作に関する動作等を指定する KEYBDINPUT 構造体 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Private Structure KEYBDINPUT Public wVk As Short '仮想キーコードのコード254の範囲内の値を設定 Public wScan As Short 'ハードウェアキーのスキャンコードを設定 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 KEYBDINPUT 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 '仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067) 'wCode 仮想キーコードまたはスキャンコード 'wMapType 実行したい変換の種類 '戻り値 スキャンコード、仮想キーコード、ASCII 値のいずれかが返ります。 ' 変換されないときは、0 が返ります。 <DllImport("user32.dll", CharSet:=CharSet.Auto)> _ Private Shared Function MapVirtualKey( _ ByVal wCode As Integer, _ ByVal wMapType As Integer) As Integer End Function 'キーボード操作を設定する為の自作構造体 'kCode 'キーコード定数を指定 'kFrg 'キーの動作を指定 0=キーダウン 1=キーアップ <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _ Private Structure keyEvents Public kCode As Integer Public kFrg As Short End Structure Private Const KEYEVENTF_KEYUP As Integer = &H2 'キーアップ キーダウン = 0 Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1 'スキャンコードは拡張コード Private Const INPUT_KEYBOARD As Integer = 1 'キーボードイベントを発生させます Private Const dwFlag1 As Integer = KEYEVENTF_EXTENDEDKEY Or 0 'キーダウン Private Const dwFlag3 As Integer = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP 'キー UP #End Region End Class 図1.上記実行結果及び使用コントロール類の配置図 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |