5.キーストロークをシミュレートする(SendInput関数使用例) |
1.キーストロークをシミュレートする(SendInput関数使用例) 2.SendInput 関数のご使用にあたって 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定:MyWaitDll 使用 API:SendInput / MapVirtualKey / CopyMemory その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。 :
|
1.キーストロークをシミュレートする(SendInput関数使用例) |
Option Explicit 'SampleNo=131 WindowsXP VB6.0(SP5) 2002.05.22 Private Type KEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long End Type Private Type INPUT_TYPE dwType As Long xi(0 To 23) As Byte End Type Private Const KEYEVENTF_KEYUP = &H2 Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード Private Const VK_SHIFT = &H10 Private Const VK_HOME = &H24 Private Const VK_END = &H23 Private Const INPUT_KEYBOARD = 1 '仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067) Private Declare Function MapVirtualKey Lib "user32" _ Alias "MapVirtualKeyA" (ByVal wCode As Long, _ ByVal wMapType As Long) As Long 'キーストローク、マウスの動作、ボタンのクリックをシミュレートする Private Declare Function SendInput Lib "user32.dll" _ (ByVal nInputs As Long, pInputs As INPUT_TYPE, _ ByVal cbsize As Long) As Long 'メモリブロックをコピーする(P1008) Private Declare Sub CopyMemory Lib "kernel32.dll" _ Alias "RtlMoveMemory" (Destination As Any, Source As Any, _ ByVal Length As Long) Private Sub sKeyEventSet(nInput As Long, _ wVkKey() As Integer, UpDown() As Integer) Dim inputevents() As INPUT_TYPE Dim keyevent As KEYBDINPUT Dim Count As Integer ReDim inputevents(nInput - 1) As INPUT_TYPE For Count = 0 To nInput - 1 With keyevent .wVk = wVkKey(Count) '操作キーコード .wScan = MapVirtualKey(wVkKey(Count), 0) 'スキャンコードを指定 If UpDown(Count) = 0 Then 'キーDown .dwFlags = KEYEVENTF_EXTENDEDKEY Or 0 Else 'キーUP .dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP End If .time = 0 .dwExtraInfo = 0 End With inputevents(Count).dwType = INPUT_KEYBOARD CopyMemory inputevents(Count).xi(0), keyevent, Len(keyevent) Next Count Call SendInput(nInput, inputevents(0), Len(inputevents(0))) End Sub Private Sub Command1_Click() Dim wVkKey() As Integer Dim UpDown() As Integer AppActivate "無題 - メモ帳" Wait 100 'メモ帳が Activate になるまで 0.1 秒待つ ReDim wVkKey(5) As Integer ReDim UpDown(5) As Integer 'キーコード定数はVBのキーコード定数でもOK wVkKey(0) = VK_HOME: UpDown(0) = 0 'UpDown(0) = 0 は省略可 wVkKey(1) = VK_HOME: UpDown(1) = 1 '0 以外は keyUP wVkKey(2) = VK_SHIFT: UpDown(2) = 0 wVkKey(3) = VK_END: UpDown(3) = 0 wVkKey(4) = VK_END: UpDown(4) = 1 wVkKey(5) = VK_SHIFT: UpDown(5) = 1 sKeyEventSet 6, wVkKey, UpDown End Sub |
2.SendInput 関数のご使用にあたって |
SendInput 関数は、Win98 or WinNT4 SP3 以降でサポートされます。 Win2000 以降はkeybd_event関数の代わりに SendInput を使ってくださいとの事です。(MSより) 又、SendInput 関数は、INPUT 構造体内のイベントを順にキーボード又は、マウス入力ストリームに挿入します。 これらのイベントに、ユーザーがキーボードまたはマウスで挿入したり、keybd_event、mouse_event に対する呼び出し又は、SendInput 関数を別に呼び出すことによって発生するイベントが割り込むことはありません。 Windows2000 で VK_SHIFT がうまく送れない現象にもスキャンコードを指定することで対応しています。 keybd_event と違って一度に処理するので使用方法が複雑ですがその分安全かと思います。 開発当時(2002/04)は、keybd_event によるキー操作が主流で、SendInput 関数を扱っているようなサンプルも見当たらず、OS が WindowsXP に切り替わってきた頃でもあり、keybd_event 関数事態もWindows2000 で VK_SHIFT がうまく送れない現象で苦慮していた時に、NAO★ さんの助言の元上記のようなコードを作る事ができました。(NAO★ さんに感謝) 尚、上記、SendInput 関数を他のアプリケーション上でも操作するのに必要なAPI関数群を一つにまとめて、DLL 化したのがSendInputV6.dll です。 SendInputV6.dll については、下記で紹介しております。 他のアプリ上でのキー操作用に特化したDLLの使用例(VB6.0) SendInput 関数のDLL化による簡単キーボード操作 |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |
SendInput 関数 キーストローク、マウスの動き、ボタンのクリックなどを合成します プログラム上からキーボードを操作する プログラムでキーを押す 他のアプリのショートカットを操作する 他のアプリケーションのショートカットキーをプログラムから操作する |