APIを使ったフォーカス移動
                                                        玄関へお回り下さい。
APIを使って↑↓Enterキーでフォーカス移動を実現             (005)
     フォームに幾つかテキストボックスを貼付け以下のコードを実行してみて下さい。
各テキストボックスにコードを記入しなくても済むし、フォーカス移動が多い場合等非常に便利かと思います。

Option Explicit   'SampleNo=005 WindowsXP VB6.0(SP5) 2002.04.16

'キーストロークをシミュレートする(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 KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード
Private Const KEYEVENTF_KEYUP = &H2    'キーはアップ状態
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  Call sKeyDown(KeyCode, Shift)
End Sub


Private Sub Form_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0  '消音用
  End If
End Sub


Private Sub Form_Load()
  'フォームのイベントを優先
  Form1.KeyPreview = True
End Sub


Private Sub sRemoveFocus(Optional Previous As Integer = 0)
  If Previous = 1 Then  '前のタブ位置へ移動 [TAB]+[TAB]
    Call keybd_event(vbKeyShift, MapVirtualKey(vbKeyShift, 0), _
        KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(vbKeyTab, MapVirtualKey(vbKeyTab, 0), _
        KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(vbKeyTab, MapVirtualKey(vbKeyTab, 0), _
        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    Call keybd_event(vbKeyShift, MapVirtualKey(vbKeyShift, 0), _
        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
  Else          '次のタブ位置へ移動 [TAB]
    Call keybd_event(vbKeyTab, MapVirtualKey(vbKeyTab, 0), _
        KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(vbKeyTab, MapVirtualKey(vbKeyTab, 0), _
        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
  End If
End Sub


Private Sub sKeyDown(KeyCode As Integer, Shift As Integer)
  If Shift = 0 Then
    Select Case KeyCode
      Case vbKeyReturn      'Enter
        Call sRemoveFocus
      Case vbKeyDown       '↓
        Call sRemoveFocus
      Case vbKeyUp        '↑
        Call sRemoveFocus(1)
      Case Else
        Exit Sub
    End Select
    KeyCode = 0
  End If
End Sub




2002/04/17