2011-04-06 58 views
0

我可以检测一个键起伏与此代码,但是一旦我把多个键vb.net忽略以前的密钥,只专注于其他关键。有人可以帮助我弄清楚如何同时检测多个关键字吗?vb.net - 的keydown /达问题

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 

回答

1

你可以保存一个已关闭的密钥列表,并将它们从KeyUp上的这个列表中删除吗?

KeyDown事件只告诉你,当一个新的关键是下来。你也不会得到的KeyDown的同时按下......因为密钥从不实际上同时按下键的消息。

所以,在的KeyDown,关键添加到列表/数组/不管,并在KEYUP,从列表中删除。

+0

那是一个非常好的主意,谢谢! – Joe 2011-04-06 21:35:31

0

问题是,除了控制,Shift和Alt等修饰键以外,两个键永远都不会在同一时间下降。操作系统总是会挑选赢家和下行事件将被交付,而不是在一个序列。

0

试试这个班我写道:

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)