繁体   English   中英

vb.net-keydown / up问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM