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.


3.Win32 API関数を使ってのEnterキーでの自由自在フォーカス移動
1.Win32 API関数を使ってのEnterキーでの自由自在フォーカス移動
2. 
3. 
4. 
5. 
6. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:
使用 API:
keybd_event / MapVirtualKey
その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。
    :
このページのトップへ移動します。 1.Win32 API関数を使ってのEnterキーでの自由自在フォーカス移動

Option Explicit 'SampleNo:005  2002.04.16   @ 2006.12.28

'キーストロークをシミュレートする(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)
  'Shift + Enter で逆移動
  If Shift = 1 And KeyCode = vbKeyReturn Then
    Call sRemoveFocus(1)
    KeyCode = 0
  End If
  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



この手のサンプルは、色々な方法が掲載されていますが、テキストボックスが幾つもあってテキストボックス個別のイベントにコードを書くのが面倒な場合とか、SendKeys "{Tab}" のような方法は、OS 等によっては、誤作動する等、又、↑↓キーでも移動したいとか逆方向への移動を望むならこのようにAPI関数を使った方法に落ち着くのかなと思ってこのサンプルも残しておきます。
(本来は、Win2000 以降はkeybd_event関数の代わりに SendInput を使ってくださいとの事ですので。)

上記プログラムの動作は、下記のような動きをします。
TAB キー又は Enter キー又は ↓キーで次のテキストボックスにフォーカスが移動します。
Shift + TAB キー又は Shift + Enter キー又は ↑キーで前のテキストボックスにフォーカスが移動します。

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


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


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


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


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


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
テキストボックスでのEnter キーによるフォーカス移動 keybd_event関数の使用例 Enterキーの入力でフォーカスを次に移動 EnterキーのTab動作扱い
Returnキーを押したら次のコントロールにフォーカスを移動させたい ReturnキーでTabキーの動作



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