8

しばらくの間、一般的な VBNET キー ハンドラーでCtrl+ Alt+をキャッチしようとしています。Right Shift Keyここに私のテストがあります:

    If e.Control And e.Alt And e.KeyCode = Keys.Space Then
        MsgBox("CTRL + ALT + SPACE") ' This work
    End If

    If e.Control And e.Shift And e.KeyCode = Keys.F10 Then
        MsgBox("CTRL + SHIFT + F10") ' This work
    End If

    If e.Control And e.Alt And e.KeyCode = Keys.ShiftKey Then
        MsgBox("CTRL + ALT + SHIFT") ' This work
    End If

    If e.Alt And e.Shift And e.KeyCode = Keys.LWin Then
        MsgBox("ALT + SHIFT + LEFT WINDOWS") ' This work
    End If

    If e.Control And e.Alt And e.KeyCode = Keys.RShiftKey Then
        MsgBox("CTRL + ALT + RIGHT SHIFT") ' This don't work
    End If

Windows 7、WinForms、VB2008、NET フレームワーク 2.0

上記の状況でCtrl+ Alt+をキャッチできないのはなぜですか? または、どうすれば ++ の組み合わせをキャッチできますか?Right Shift Key
CtrlAltRight Shift Key

4

3 に答える 3

6

標準の VB.NET アプローチを使用してシフト間の違いを検出する方法はありません。そのためには、Windows API にフックする必要があります。

 <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Private Shared Function GetAsyncKeyState(vKey As Keys) As Short
    End Function

    Private Sub Form2_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown

        If e.Control And e.Alt And e.Shift Then

            If Convert.ToBoolean(GetAsyncKeyState(Keys.LShiftKey)) Then
                MsgBox("CTRL + ALT + LEFT SHIFT")
            ElseIf Convert.ToBoolean(GetAsyncKeyState(Keys.RShiftKey)) Then
                MsgBox("CTRL + ALT + RIGHT SHIFT")
            End If

        End If

    End Sub
于 2013-08-16T21:39:26.163 に答える
3

これらはすべて修飾キーであり、ユーザーは任意の順序でキーを押すことができるため、これは注意が必要です。4番目のキーを押しても一致が再び生成されないようにするために、フィルタリングを行う必要があります。これは、受け入れられた回答の問題です。また、右シフト キーは難しく、押されたときに Keys.Shift として報告されます。キーがダウンしているかどうかを確認するには、pinvoke が必要です。

これはうまくいきました:

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    If Control.ModifierKeys = (Keys.Control Or Keys.Alt Or Keys.Shift) Then
        If e.KeyCode = Keys.ControlKey Or e.KeyCode = Keys.Menu Or e.KeyCode = Keys.ShiftKey Then
            If GetKeyState(Keys.RShiftKey) < 0 And GetKeyState(Keys.LShiftKey) >= 0 Then
                MessageBox.Show("yada")
            End If
        End If
    End If
End Sub

Private Declare Function GetKeyState Lib "user32.dll" (ByVal key As Keys) As Short

これは、最初に 3 つの修飾キーがすべて押されていることを確認することによって機能します。次に、最後に押されたキーが3 つのキーのうちの1 つであることを確認します。これは、一致するキーが多すぎないようにするためのフィルター処理です。最後に、右シフト キーが押されていて、左シフト キーを押してもそこに到達しなかったかどうかを確認します。

于 2013-08-16T21:51:09.997 に答える
1

これを見てください:

    If e.Control And e.Alt And e.KeyCode = Keys.ShiftKey Then
        MsgBox("CTRL + ALT + SHIFT") ' This work
        Debug.Print("CTRL + ALT + SHIFT" & GetAsyncKeyState(Keys.ShiftKey) & GetAsyncKeyState(Keys.RShiftKey)) 
    End If

    If e.Control And e.Alt And e.KeyCode = Keys.RShiftKey Then
        MsgBox("CTRL + ALT + RIGHT SHIFT") ' This don't work
        Debug.Print("CTRL + ALT + RIGHT SHIFT " & GetAsyncKeyState(Keys.ShiftKey) & GetAsyncKeyState(Keys.RShiftKey))
    End If

Keys.ShiftKey の値が左右で同じであることがわかります。Keys.RShiftKey のテストが変更されました。API 呼び出しには、上記の DECLARE が必要です。

于 2013-08-16T21:59:25.170 に答える