8

一段时间以来,我试图在常见的VBNET密钥处理程序下捕获Ctrl++ 。这是我的测试:AltRight 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++ ? 或者,我如何捕捉++组合?AltRight Shift Key
CtrlAltRight Shift Key

4

3 回答 3

6

无法使用标准 VB.NET 方法检测 Shift 之间的差异。为此,您必须使用 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

这首先验证所有三个修改键都已关闭。然后它会检查最后按下的键是否是三个键之一,该过滤可确保您不会获得太多匹配项。最后,它检查右移键是否按下,并且按下左移键也没有到达那里。

于 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 回答