特殊キーの状態を取得・タブキーの押下を取得する
                                                         玄関へお回り下さい。
特殊キーの現在の状態を取得する・タブキーの押下を取得する    (002)
          Option Explicit  'SampleNo=002 WindowsXP VB6.0(SP5) 2002.04.16

'仮想キーの押下状態を取得する(P1064)
Private Declare Function GetKeyState Lib "user32" _
  (ByVal nVirtKey As Long) As Integer

'キーストロークをシミュレートする(P1065)
Private Declare Sub keybd_event Lib "user32.dll" _
  (ByVal bVk As Byte, ByVal bScan As Byte, _
   ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

'仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
Private Declare Function MapVirtualKey Lib "user32" _
  Alias "MapVirtualKeyA" (ByVal wCode As Long, _
  ByVal wMapType As Long) As Long

Private Const VK_CAPITAL = &H14
Private Const VK_INSERT = &H2D
Private Const VK_SHIFT = &H10
Private Const VK_NUMLOCK = &H90
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2


Private Sub
Command2_Click()
'各特殊キーの現在の状態を取得(下位ビットを取得 1=ON 0=OFF)
  If GetKeyState(vbKeyCapital) And &H1 Then
    Label3.Caption = "CapsLook キーはオンの状態です。"
  Else
    Label3.Caption = "CapsLook キーはオフの状態です。"
  End If
  If GetKeyState(vbKeyNumlock) And &H1 Then
    Label4.Caption = "Numlock キーはオンの状態です。"
  Else
    Label4.Caption = "Numlock キーはオフの状態です。"
  End If
  If GetKeyState(vbKeyInsert) And &H1 Then
    Label5.Caption = "Insert キーはオンの状態です。"
  Else
    Label5.Caption = "Insert キーはオフの状態です。"
  End If
End Sub


Private Sub Text1_LostFocus()
'タブキーが押されたか?調査
  If GetKeyState(vbKeyTab) < 0 Then
    Label2.Caption = "タブキーが押されました。"
  Else
    Label2.Caption = ""
  End If
End Sub


Private Sub Timer1_Timer()
     '符号付き変数の最上位ビットは符号情報が入っているのでこれで判断できます
  If GetKeyState(vbKeyTab) < 0 And _
              GetKeyState(VK_SHIFT) < 0 Then
    Label1.Caption = "Shift キーとタブキーが押されました。"
  ElseIf GetKeyState(vbKeyTab) < 0 Then
    Label1.Caption = "タブキーが押されました。"
  Else
    Label1.Caption = ""
  End If
End Sub


Private Sub Command3_Click()
'CapsLock キーをクリック
  Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), _
                KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub


Private Sub Command4_Click()
'Insert キーをクリック
  Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), _
                KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub


Private Sub Command5_Click()
'NumLock キーをクリック
  Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), _
                KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub


結果
    

通常、KeyDown イベントおよび KeyUp イベントではTab キーのイベントは発生(取得できない)し
ません。
Tab キーが押されたかを取得するには、すべてのコントロールのTabStopをFalseに設定するか
GetKeyState API関数を使用してタイマーイベントで監視するかLostFocusイベントで関数を呼び
出せば実現できます。
又、VBのKeyDown イベントでは発生しないNumLockキー等のトグル状態も取得できます。

MapVirtualKey APIでスキャンコードを得ることでWindows2000以降のShift キー等の動作不良にも
対応。Win2000以前ならkeybd_eventAPI単独使用でも問題なく動作するようです。
     



2002/04/16