1

我在 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

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

谢谢你的帮助

4

1 回答 1

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,这样你就可以看到每个块可以做不同的事情。您可能不想Me.Refresh在 KeyDown() 事件的最底部调用,因此它只被调用一次。

于 2013-05-12T14:05:26.023 回答