VB6フォームで [Enter] キーが押された時にフォーカスを遷移させる

スポンサーリンク

汎用機のように [Enter] キーで入力フィールドを遷移させる方法です。この手の質問は、未だに多くの掲示板で見かけるゆえにやむなく Tips を書いております。初めに、これだけは頭に入れておいてください。

  • Windows のフォーカス遷移は [Tab] キーである
  • 実装しようとしている [Enter] キーには別の役割がある
  • 汎用機の概念を Windows に持ち込むことは Windows の GUI を概念から壊すことである

そういうわけで、仕様を見直すことをお勧めします。しかしながら、お仕事の関係上やむを得ない場合は参考にしてください。

方法としては、フォームの KeyPreview を True にしてフォームで一括処理するのが楽かと思います。というよりは、各コントロールのキーイベントで実装すると、保守性が悪くなります。ちなみに、MultiLine なテキストボックスで改行を [Ctrl] + [Enter] で代用できるように考慮しています。

利用の際には KeyPreview を True にしておいてください。

VB6 でも、コントロールを列挙して次の TabIndex があるコントロールにフォーカスさせても良いのですが、フォーカスしても良いコントロールかどうかの判断が複雑になってしまいます。手軽に、Win32 API で Tab キーを飛ばした方が賢明かと思われます。今回は PostMessage 関数を使って、ポストする方法を紹介します。(他にもたくさんの方法があります)

利用の際には KeyPreviewTrue にしておいてください。

サンプルコード

以下にサンプルコードを示します。

VB6.0 以前
Option Explicit

' PostMessage 関数
Private Declare Function PostMessage Lib "USER32.DLL" Alias "PostMessageA" ( _
    ByVal hWnd   As Long, _
    ByVal wMsg   As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long  _
) As Long

' 定数の定義
Private Const WM_KEYDOWN As Long = &H100    ' キー押し下げ
Private Const VK_TAB     As Long = &H9      ' Tab キー

' [Enter] キーで [Tab] キーを飛ばすことによってフォーカス遷移する
Private Sub Form_KeyPress(ByRef KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        Call PostMessage(Me.hWnd, WM_KEYDOWN, VK_TAB, ByVal 0&)
        KeyAscii = 0 '音を消す
    End If
End Sub

関連するリファレンス

準備中です。

スポンサーリンク