2011-04-06 63 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)