vb5を参考にVB2005 .NET に置き換えの作業を行っております。
特殊キーの状態を取得・タブキーの押下を取得するために
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
を使用して
テキストのLostFocusでtab + shiftが押されたときは指定のコントロールに移動するようになっています。
これを
VB2005 .NET に置き換えると
VB5とは違う値を取得して同じ制御ができません。
tab + shift が押されたときに同じコントロールに飛ばしたいのですがどのようにすればよいのでしょうか?
ご教授お願いします。
例
VB5
Private Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As Integer
テキスト_LostFocus()
If GetKeyState(9) < 0 And GetKeyState(16) < 0 Then
指定コントロール.SetFocus
else
次のコントロール.SetFocus
end if
End Sub
NET
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer
テキスト_Leave()
If GetKeyState(9) < 0 And GetKeyState(16) < 0 Then
指定コントロール.SetFocus
else
次のコントロール.SetFocus
end if
End Sub
参考URL
http://hanatyan.sakura.ne.jp/vbhlp/specialkey.htm
まず、LostFocus イベントでフォーカスを移動させてはいけません。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.lostfocus(VS.90).aspx
さて本題ですが、とりあえず旧 VB における実装方法は忘れて下さい。
.NET の WinForm では、TAB キーの入力は、そのコントロールの親(先祖)の ProcessDialogKey メソッドによって判定されます。
そこで、フォームの ProcessDialogKey をオーバーライドし、入力された keyData が Keys.Shift And Keys.Tab かどうか、及び ActiveControl が目的の TextBox かどうか(TextBox が Form から見て孫(間に Panel とかが挟まっている)とかだったらちょっと面倒ですが)を判定し、当てはまっていればフォーカスの移動を行います。
そしてこのときは自前で入力を処理したとして True を返し、それ以外のときは MyBase.ProcessDialogKey の結果をそのまま返すようにします。
ツイート | ![]() |