tab + shift が押されているのを取得するには?


ハル  2010-04-22 04:07:52  No: 146841

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


Hongliang  2010-04-22 04:54:26  No: 146842

まず、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 の結果をそのまま返すようにします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加