Option Explicit

Public Const KEY_DOWN = 0   'キー押下
Public Const KEY_UP = 1     'キーアップ

' 指定時間Wait(ミリ秒)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)



Type KEYBDINPUT
      wVk As Integer
      wScan As Integer
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
      no_use1 As Long
      no_use2 As Long
End Type

Type INPUT_TYPE
      dwType As Long
      xi As KEYBDINPUT
End Type


'仮想キーコード
Public Const VK_CTRL = &H11        'Contorol
Public Const VK_V = &H56           '「V」

Private Const KEYEVENTF_KEYUP = &H2 'キーアップ
Private Const KEYEVENTF_EXTENDEDKEY = &H1   'スキャンコードは拡張コード
Private Const INPUT_KEYBOARD = 1    '入力タイプ:キーボード

'仮想キーコード・ASCII値・スキャンコード間でコードを変換する
Declare Function MapVirtualKey Lib "user32" _
    Alias "MapVirtualKeyA" (ByVal wCode As Long, _
    ByVal wMapType As Long) As Long
'
' 仮想キーコードをスキャンコード、または文字の値(ASCII 値)へ変換。
' また、スキャンコードを仮想コードへ変換も可。
'
'[入力
'  wCode:キーの仮想キーコード、またはスキャンコードを指定。
'     この値の解釈方法は、wMapType パラメータの値に依存。
'
'  uMapType:実行したい変換の種類を指定。
'  このパラメータの値に基づいて、uCode パラメータの値は次のように解釈。
'
'  値 意味
'   0 wCode は仮想キーコードであり、スキャンコードへ変換。
'    左右のキーを区別しない仮想キーコードのときは、関数は左側のスキャンコードを返却。
'   1 wCode はスキャンコードであり、仮想キーコードへ変換。
'    この仮想キーコードは、左右のキーを区別。
'   2 wCode は仮想キーコードであり、戻り値の下位ワードにシフトなしの ASCII 値が格納。
'    デッドキー( 分音符号)は、戻り値の上位ビットをセットすることにより明示される。
'   3 Windows NT/2000:uCode はスキャンコードであり、左右のキーを区別する仮想キーコードへ変換。
'
'    いづれも、変換されないときは、関数は 0 を返す。



'キーボード入力、マウスボタンのクリックをシミュレートする
Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, _
     pInputs As INPUT_TYPE, ByVal cbSize As Long) As Long
'
' nInputs:構造体の数を指定
' pInputs:配列へのポインタ INPUT 構造
'     各構造体には、キーボードまたはマウス入力動作に対応するイベントを表す
' cbSize :構造体のサイズを指定


Sub KeyEvent(VkKey As Integer, UpDown As Integer)
'
' 簡略化のためにAPIへは1文字ずつ入力⇒構造体は1つ
'
' VkKey:仮想キーコード
' UpDown:動作(KEY_DOWN/KEY_UP)
'
    Dim inputevents As INPUT_TYPE
    With inputevents
        .dwType = INPUT_KEYBOARD
        With .xi
            .wVk = VkKey        '操作キーコード
            .wScan = MapVirtualKey(VkKey, 0)  'スキャンコード
            If UpDown = KEY_DOWN Then   'キーDown
                .dwFlags = KEYEVENTF_EXTENDEDKEY Or 0
            Else                        'キーUP
                .dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
            End If
            .time = 0
            .dwExtraInfo = 0
        End With
    End With
    Call SendInput(1, inputevents, Len(inputevents))
End Sub