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