如何捕捉Ctrl + Alt + RShftKey

时间:2013-08-16 21:21:23

标签: vb.net

有一段时间我试图在常见的VBNET密钥处理程序下捕获 Ctrl + Alt + 右移键。 以下是我的测试:

    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 framework 2.0

为什么我无法在描述的情况下抓住 Ctrl + Alt + 右移键
或者,如何捕获 Ctrl + Alt + 右移键组合?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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

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

答案 2 :(得分: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。