[英]vb.net - keydown / up issue
我可以使用此代码检测单个按键按下,但是一旦按下多个按键,vb.net就会忽略前一个按键,而只关注另一个按键。 有人可以帮我弄清楚如何同时检测多个按键按下吗?
Private Sub frmMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.W Or e.KeyCode = Keys.S Or e.KeyCode = Keys.A Or e.KeyCode = Keys.D Then
lblDrive.Text = "Driving: "
If e.KeyCode = Keys.W Then
lblDrive.Text = lblDrive.Text & "FORWARD "
End If
If e.KeyCode = Keys.S Then
lblDrive.Text = lblDrive.Text & "REVERSE "
End If
If e.KeyCode = Keys.A Then
lblDrive.Text = lblDrive.Text & "LEFT "
End If
If e.KeyCode = Keys.D Then
lblDrive.Text = lblDrive.Text & "RIGHT "
End If
End If
End Sub
您可以保留一个已关闭的键列表,并将其从KeyUp上的此列表中删除吗?
KeyDown事件仅在按下新键时通知您。 您也不会同时按下按键时收到KeyDown消息...因为实际上从未同时按下按键。
因此,在KeyDown上,将密钥添加到列表/数组/任何内容,在KeyUp上,将其从该列表中删除。
问题在于,除了修饰键(例如Control,Shift和Alt)外,两个键永远不会在同一时间按下。 操作系统将始终选择获胜者,而向下事件将按顺序发送。
试试我写的这个课:
Public Class Keyboard
Inherits Dictionary(Of Keys, Boolean)
Public Sub New()
For Each key As System.Windows.Forms.Keys In [Enum].GetValues(GetType(System.Windows.Forms.Keys))
If Not Me.ContainsKey(key) Then Me.Add(key, False)
Next
End Sub
Private Sub KeyDown_Listener(ByVal sender As Object, ByVal e As KeyEventArgs)
Me(e.KeyCode) = True
End Sub
Private Sub KeyUp_Listener(ByVal sender As Object, ByVal e As KeyEventArgs)
Me(e.KeyCode) = False
End Sub
Private Sub LostFocus_Listener(ByVal sender As Object, ByVal e As EventArgs)
For i As Integer = 0 To Me.Keys.Count - 1
Me(Me.Keys(i)) = False
Next
End Sub
Public Sub Attach(ByVal Control As Control)
AddHandler Control.KeyDown, AddressOf KeyDown_Listener
AddHandler Control.KeyUp, AddressOf KeyUp_Listener
AddHandler Control.LostFocus, AddressOf LostFocus_Listener
End Sub
Public Function GetPressedKeys() As List(Of Keys)
Return (From e As KeyValuePair(Of Keys, Boolean) In Me Where e.Value = True Select e.Key).ToList
End Function
Public Function GetUnPressedKeys() As List(Of Keys)
Return (From e As KeyValuePair(Of Keys, Boolean) In Me Where e.Value = False Select e.Key).ToList
End Function
Public Function IsKeyPressed(ByVal Key As Keys) As Boolean
Return Me(Key)
End Function
End Class
使它成为表单类的成员,然后在其中扔一个Keyboard.Attach(Me)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.