フォームで [Enter] キーが押された時にフォーカスを遷移させる
スポンサーリンク
汎用機のように [Enter] キーで入力フィールドを遷移させる方法です。この手の質問は、未だに多くの掲示板で見かけるゆえにやむなく Tips を書いております。初めに、これだけは頭に入れておいてください。
- Windows のフォーカス遷移は [Tab] キーである
- 実装しようとしている [Enter] キーには別の役割がある
- 汎用機の概念を Windows に持ち込むことは Windows の GUI を概念から壊すことである
そういうわけで、仕様を見直すことをお勧めします。しかしながら、お仕事の関係上やむを得ない場合は参考にしてください。
方法としては、フォームの KeyPreview を True にしてフォームで一括処理するのが楽かと思います。というよりは、各コントロールのキーイベントで実装すると、保守性が悪くなります。ちなみに、MultiLine なテキストボックスで改行を [Ctrl] + [Enter] で代用できるように考慮しています。
利用の際には KeyPreview を True にしておいてください。
VB6 でも、コントロールを列挙して次の TabIndex があるコントロールにフォーカスさせても良いのですが、フォーカスしても良いコントロールかどうかの判断が複雑になってしまいます。手軽に、Win32 API で Tab キーを飛ばした方が賢明かと思われます。今回は PostMessage 関数を使って、ポストする方法を紹介します。(他にもたくさんの方法があります)
利用の際には KeyPreview を True にしておいてください。
サンプルコード
以下にサンプルコードを示します。
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
関連するリファレンス
準備中です。