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

タイマーなしでそれを行うことができますが、それでも 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.RefreshKeyDown() イベントの一番下まで呼び出したくない場合があるため、一度だけ呼び出されます。

于 2013-05-12T14:05:26.023 に答える