有一段时间我试图在常见的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 + 右移键组合?
答案 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。