Vb.net 如何捕捉Ctrl+;Alt+;RShftKey

Vb.net 如何捕捉Ctrl+;Alt+;RShftKey,vb.net,Vb.net,有一段时间,我试图在公共VBNET键处理程序下捕获Ctrl+Alt+Right Shift键。 以下是我的测试: 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

有一段时间,我试图在公共VBNET键处理程序下捕获Ctrl+Alt+Right Shift键。 以下是我的测试:

    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+Right Shift键?

或者,如何捕捉Ctrl+Alt+Right Shift组合键?

使用标准的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
_
私有共享函数GetAsyncKeyState(vKey作为键)为短
端函数
私有子表单2u KeyDown(发送方作为对象,e作为KeyEventArgs)处理Me.KeyDown
如果e.控制和e.Alt和e.Shift,则
如果Convert.ToBoolean(GetAsyncKeyState(Keys.LShiftKey)),则
MsgBox(“CTRL+ALT+LEFT SHIFT”)
ElseIf Convert.ToBoolean(GetAsyncKeyState(Keys.RShiftKey))然后
MsgBox(“CTRL+ALT+RIGHT SHIFT”)
如果结束
如果结束
端接头

嗯,这很棘手,因为这些都是修改键,用户可以按任意顺序按下它们。您需要进行一些过滤,以确保第四次按键不会再次产生匹配,这是一个与已接受答案有关的问题。并且右shift键很难,它被报告为键。按下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
Private子表单1\u KeyDown(发送方作为对象,e作为KeyEventArgs)处理MyBase.KeyDown
如果Control.ModifierKeys=(Keys.Control或Keys.Alt或Keys.Shift),则
如果e.KeyCode=Keys.ControlKey或e.KeyCode=Keys.Menu或e.KeyCode=Keys.ShiftKey,则
如果GetKeyState(Keys.RShiftKey)<0且GetKeyState(Keys.LShiftKey)>=0,则
MessageBox.Show(“yada”)
如果结束
如果结束
如果结束
端接头
将私有函数GetKeyState Lib“user32.dll”(ByVal键作为键)短声明为
这是通过首先验证所有三个修改器关键点都已关闭来实现的。然后检查最后按下的键是否是三个键中的一个,过滤功能确保不会获得太多匹配项。最后,它会检查右换档键是否已按下,并且按下左换档键时它是否未到达该位置。

请查看以下内容:

    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的值对于left和right是相同的。钥匙测试。换档钥匙更改。API调用需要上面的声明。

非常有趣。那么为什么RShiftKey和LShiftKey会在Keys常量下枚举呢?LControlKey和RControlKey是否也同样适用?还有什么不能像预期的那样工作?更新了我的答案,使之成为可行的解决方案-这就是您使用枚举代码的地方,因为它有一个问题。按住三个键后按任意其他键,可以看到它触发了消息框。您的意思是按住ctrl+alt+shift并显示消息后?谢谢Hans,您的示例也会按预期工作,但Yuri会首先响应。答案不同。当然不是,但都基于user32.dll和众所周知的GetKeyState。你认为尤里的解决方案不够好吗?通过测试,它表现良好。我不知道我是否理解得很好,但如果我先按RShift,然后按Control,然后按Alt,您的示例也可以工作,但这没关系,我认为…最好是,您不能指望用户选择正确的顺序。有趣的实验给出了“可行的结果”:如果e.Control和e.Alt以及GetAsyncKeyState(Keys.RShiftKey),那么。。。