tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル逆フォーカス移動
記事No4530
投稿日: 2006/11/16(Thu) 09:27
投稿者フウセンウナギ
WindowsXP SP2   VB2005

ここのTipsをいつも参考にしています。

テキストのエンターキーによるフォーカス移動は
Sendkeysを使うことが分かりました。
次に逆フォーカス移動を考えているのですが、Shift+Enterでなく順フォーカス移動と同様に
ボタン1つで行おうと思います。

VB6のときはAPI関数のkeybd_eventを使って

    'シフトボタンを押した
        Call keybd_event(vbKeyShift, 0, 0, 0)
        'ボタンを押した
        Call keybd_event(vbKeyTab, 0, 0, 0)
        'ボタンを放した
        Call keybd_event(vbKeyTab, 0, 2, 0)
        'シフトボタンを放した
        Call keybd_event(vbKeyShift, 0, 2, 0)

という風にできたのですが、vb2005ではkeybd_eventは使えない?ようで、うまくいきません。
何かいい方法はあるのでしょうか?

[ツリー表示へ]
タイトルRe: 逆フォーカス移動
記事No4531
投稿日: 2006/11/16(Thu) 09:48
投稿者K.J.K.
SelectNextControlメソッドについて調べてみるとか。

[ツリー表示へ]
タイトルRe: 逆フォーカス移動
記事No4532
投稿日: 2006/11/16(Thu) 10:06
投稿者花ちゃん
> という風にできたのですが、vb2005ではkeybd_eventは使えない?ようで、うまくいきません。

VB2005 でも、Win32API関数(keybd_event)は使用できますよ。
この掲示板の[ワード検索]で keybd_event をキーワードに検索して見て下さい。

[ツリー表示へ]
タイトルRe^2: 逆フォーカス移動
記事No4534
投稿日: 2006/11/16(Thu) 10:45
投稿者フウセンウナギ
> > という風にできたのですが、vb2005ではkeybd_eventは使えない?ようで、うまくいきません。
>
> VB2005 でも、Win32API関数(keybd_event)は使用できますよ。
> この掲示板の[ワード検索]で keybd_event をキーワードに検索して見て下さい。


keybd_eventのapi関数の宣言のところで、型をすべてintegerに変えると認識してくれました。
    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Integer, _
                                    ByVal bScan As Integer, _
                                    ByVal dwFlags As Integer, _
                                    ByVal dwExtraInfo As Integer)

それで以下のようにイベントを書いてみました。
フォームにテキストを4つ用意します。タブ順序はt1→t2→t3→t4です。

    Private Sub t1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
    Handles t1.KeyDown, t2.KeyDown, t3.KeyDown, t4.KeyDown

        t1 = DirectCast(sender, TextBox)
        Select Case e.KeyCode
            Case Keys.Return, Keys.Down
                'ボタンを押した
                Call keybd_event(Keys.Tab, 0, 0, 0)
                'ボタンを放した
                Call keybd_event(Keys.Tab, 0, 2, 0)
            Case Keys.Up
                'シフトボタンを押した
                Call keybd_event(Keys.Shift, 0, 0, 0)
                'ボタンを押した
                Call keybd_event(Keys.Tab, 0, 0, 0)
                'ボタンを放した
                Call keybd_event(Keys.Tab, 0, 2, 0)
                'シフトボタンを放した
                Call keybd_event(Keys.Shift, 0, 2, 0)
        End Select
    End Sub

エンター・下キーで順タブ移動、上キーで逆タブ移動をするのですが、上キーを押しても順タブ
移動になってしまいます。
また、t1〜t4を一巡すると、t1でエンターキーを押しても何も反応してくれません。
何か問題があるのでしょうか?

[ツリー表示へ]
タイトルRe^3: 逆フォーカス移動
記事No4537
投稿日: 2006/11/16(Thu) 12:22
投稿者花ちゃん
ここのVB6.0のコードを.NET 用に移行して見て下さい。

それとも、下記を試して見て下さい。
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As _
                  System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
   If e.KeyCode = Keys.Up Then
      Me.SelectNextControl(Me.ActiveControl, e.Shift, True, True, True)
   ElseIf e.KeyCode = Keys.Down Then
      Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
   End If
End Sub

[ツリー表示へ]
タイトルRe^4: 逆フォーカス移動
記事No4538
投稿日: 2006/11/16(Thu) 13:15
投稿者フウセンウナギ
> ここのVB6.0のコードを.NET 用に移行して見て下さい。
>
> それとも、下記を試して見て下さい。
> Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As _
>                   System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
>    If e.KeyCode = Keys.Up Then
>       Me.SelectNextControl(Me.ActiveControl, e.Shift, True, True, True)
>    ElseIf e.KeyCode = Keys.Down Then
>       Me.SelectNextControl(Me.ActiveControl, Not e.Shift, True, True, True)
>    End If
> End Sub


SelectNextControlの引数の指定でできるんですね。
ありがとうです。

[ツリー表示へ]