简体   繁体   中英

How to handle KeyDown in VB.NET

Ok here's my dilemma. here's this code I have:

   If e.KeyCode = Keys.A Then
        TextBox1.AppendText("C, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
   End If

Now when I enter this under Form1_KeyDown, visual basic thinks this:

'KeyCode is not aa member of 'System.EventArgs'

Now I've seen this code work before, but it isn't here. Any help?

Here's the full code:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.KeyCode = Keys.A Then
        TextBox1.AppendText("A, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    End If
    If e.KeyCode = Keys.S Then
        TextBox1.AppendText("C,")
        PictureBox14.Visible = True
        My.Computer.Audio.Play(My.Resources.D, AudioPlayMode.Background)
    End If
End Sub

Not sure why you method definition declares e as EventArgs , but the fix is simply to make the parameter of type KeyEventArgs . This is because EventArgs (naturally) does not contain a property called KeyCode , but KeyEventArgs does!

Change your event handler method definition to the following:

Private Sub foo_KeyDown(sender As Object, e As KeyEventArgs)
    If e.KeyCode = Keys.A Then
        TextBox1.AppendText("A, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    ElseIf e.KeyCode = Keys.S Then
        TextBox1.AppendText("C,")
        PictureBox14.Visible = True
        My.Computer.Audio.Play(My.Resources.D, AudioPlayMode.Background)
    End If
End Sub

It sounds like your method is using the wrong EventArgs. The Control.KeyDown event sends it as a System.Windows.Forms.KeyEventArgs. So your code should read as

Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs)
   // code here
End Sub

I've found sometimes you need to provide the full object type similar to the below:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
MsgBox(e.KeyCode.ToString()) 'Message what the keycode
If (e.KeyCode = Keys.A) Then
    MsgBox("e.KeyCode = Keys.A") 'Message that I've found the A
    TextBox1.AppendText("C, ")
    PictureBox2.Visible = True
    My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
End If

End Sub

Have you also tried testing this in a textbox on the form similar to the below (textbox in example is named TextBoxKeyTest)?

    Private Sub TextBoxKeyTest_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBoxKeyTest.KeyDown
    MsgBox(e.KeyCode.ToString())'Message what the keycode
    If (e.KeyCode = Keys.A) Then
        MsgBox("e.KeyCode = Keys.A")'Message that I've found the A
        TextBox1.AppendText("C, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    End If
End Sub

This should work in VB 2010

Private Sub cmdWiden_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.Up Then Me.Top = Me.Top - 5
        If e.KeyCode = Keys.Down Then Me.Top = Me.Top + 5
        If e.KeyCode = Keys.Left Then Me.Left = Me.Left - 5
        If e.KeyCode = Keys.Right Then Me.Left = Me.Left + 5
End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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