我在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
我试图谷歌这个,但问题是没有人使用线程按键导致不同的解决方案。
感谢您的帮助
答案 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
,因此只调用一次。