VB.net多线程按键

时间:2013-05-12 12:33:29

标签: multithreading keypress keydown

我在VB.net中有一个工作的3D对象查看器(我知道VB.net不是最好用的语言,但仍然)

因此,如果按下W键,框会向上移动。如果我按下D键,它会向右移动。但我想同时做。为此,我想我可以给每个键自己的线程。

这就是我收到的代码。

Dim thread1 As System.Threading.Thread
Dim thread2 As System.Threading.Thread

Private Sub MoveUp_Keydown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles GlControl1.KeyDown
    If e.KeyCode = Keys.W Then
        If NumericUpDown1.Value < 100 Then
            NumericUpDown1.Value = NumericUpDown1.Value + 1
            Me.Refresh()
        End If
    End If
End Sub

Private Sub MoveUp1_Keydown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles GlControl1.KeyDown
    If e.KeyCode = Keys.W Then
        thread1 = New System.Threading.Thread(AddressOf MoveUp_Keydown)
    End If
End Sub

但我得到的错误是

error BC30518: Overload resolution failed because no accessible 'New' can be called with these arguments

我试图谷歌这个,但问题是没有人使用线程按键导致不同的解决方案。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以在没有Timer但仍使用GetKeyState()API的情况下执行此操作:

Public Class Form1

    <Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Unicode)> _
    Private Shared Function GetKeyState(ByVal nVirtKey As Integer) As Short
    End Function

    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If IsKeyDown(Keys.W) Then
            If NumericUpDown1.Value < 100 Then
                NumericUpDown1.Value = NumericUpDown1.Value + 1
                Me.Refresh()
            End If
        End If

        If IsKeyDown(Keys.D) Then
            If NumericUpDown2.Value < 100 Then
                NumericUpDown2.Value = NumericUpDown2.Value + 1
                Me.Refresh()
            End If
        End If

        ' ...etc...
    End Sub

    Private Function IsKeyDown(ByVal key As Keys) As Boolean
        Return GetKeyState(key) < 0
    End Function

End Class

KeyDown()事件将在按下任何键时触发,您只需使用GetKeyState()检查您感兴趣的每个键。不需要多个线程......我甚至不确定这对表单事件有什么用处。我不知道你想用“D”键做什么,所以我只是放入NumericUpDown2,这样你就可以看到每个块可以做不同的事情。您可能不希望在KeyDown()事件的最底部调用Me.Refresh,因此只调用一次。