コマンドボタンのフォーカス移動について教えてください。
_____ _____
| Command1 | | Command2 |
‾‾‾‾‾ ‾‾‾‾‾
_____ _____
| Command3 | | Command4 |
‾‾‾‾‾ ‾‾‾‾‾
上記のようにコマンドボタンを配置した場合、
タブを押した際のフォーカスの移動は、
Command1 → Command2 → Command3 → Command4 のままで、
Command1にフォーカスがあるとき、キーボードの↓が押されたとき、
Command3にフォーカスを移すことはできますでしょうか
以下のようにした場合、キーを拾いませんでした。
Private Sub command1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyDown
Command3.SetFocus
End Select
End Sub
良い方法があれば、教えてください。
よろしくお願いします。
# 掲示板が半壊してますね。また、容量不足による障害が起きているのかな……。
> 以下のようにした場合、キーを拾いませんでした。
矢印キーは、『「コンテナ内」の次の(前の)ボタンへの移動』と
して扱われます。(タブキーとは異なる動作です)
で、残念なことに、ボタン系コントロールの上では、矢印キーを
検知する事ができません。VBの標準イベントだけでは無理です。
ボタン系のコントロールを使わず、PictureBox等で代用するなどの
回避策を取るか、どうしても処理したいなら、SetWindowsHookEx API などで
キー押下を検知し、制御する事になるでしょう。
TabIndexとカーソルキーって連動していなかったのか・・・
なんか意味を勘違いしてたようなので、提案を
Command1とCommand3とをコンテナに、Command2とCommand4とをコンテナに
ふたつずつ分けて格納したらどうでしょうか?
TabIndexは1→2→3→4にすればいいですよね?
APIを使って無理矢理に実装してみた場合。
'--- 標準モジュール
Option Explicit
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Const WH_KEYBOARD As Long = 2
Private mlngHook As Long
Public Sub Hook()
mlngHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
End Sub
Public Sub Unhook()
UnhookWindowsHookEx mlngHook
mlngHook = 0
End Sub
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static blnReEnter As Boolean
If wParam <> vbKeyRight And _
wParam <> vbKeyLeft And _
wParam <> vbKeyUp And _
wParam <> vbKeyDown Then
KeyboardProc = CallNextHookEx(mlngHook, nCode, wParam, lParam)
ElseIf blnReEnter = False Then
blnReEnter = True
KeyboardProc = 1
Else
On Error Resume Next
Form1.ArrowKeyClick wParam
KeyboardProc = 1
blnReEnter = False
End If
End Function
'--- Form1
Option Explicit
Private Sub Form_Load()
Hook
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Unhook
End Sub
Public Sub ArrowKeyClick(ByVal KeyCode As KeyCodeConstants)
' [Command1] ←→ [Command2]
' ↑ ↑
' ↓ ↓
' [Command3] ←→ [Command4]
If KeyCode = vbKeyRight Then
If ActiveControl Is Command1 Then
Command2.SetFocus
ElseIf ActiveControl Is Command3 Then
Command4.SetFocus
End If
ElseIf KeyCode = vbKeyLeft Then
If ActiveControl Is Command2 Then
Command1.SetFocus
ElseIf ActiveControl Is Command4 Then
Command3.SetFocus
End If
ElseIf KeyCode = vbKeyDown Then
If ActiveControl Is Command1 Then
Command3.SetFocus
ElseIf ActiveControl Is Command2 Then
Command4.SetFocus
End If
ElseIf KeyCode = vbKeyUp Then
If ActiveControl Is Command3 Then
Command1.SetFocus
ElseIf ActiveControl Is Command4 Then
Command2.SetFocus
End If
End If
End Sub
魔界の仮面弁士 さん、ありがとうございます。
イメージしていた動きが実現できました。
ツイート | ![]() |