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

リンク元へ戻ります。 キーボード・キー操作関係のメニュー
1.基本的なキー操作色々
2.特殊キーの状態を取得及び設定する
3.Win32 API関数を使ってのEnterキーでの自由自在フォーカス移動
4.SendInput 関数のDLL化による簡単キーボード操作
5.キーストロークをシミュレートする(SendInput関数使用例)
6.
7.スナップショットをファイルに保存及び印刷(SendInput関数使用例)
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


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 関数  キーストローク、マウスの動き、ボタンのクリックなどを合成します
プログラム上からキーボードを操作する プログラムでキーを押す
他のアプリのショートカットを操作する 他のアプリケーションのショートカットキーをプログラムから操作する


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