0

ボタンを押すだけでマウスを繰り返し左クリックするビデオゲームで使用する「オートクリッカー」を作成しています。オートクリッカー ウィンドウがフォーカスされていなくても、グローバルに機能するホットキーを設定したいと考えています。何らかの理由で、クリックを停止するためのホットキー (F2) のみが現在機能しています。F1 キーはクリックを開始することになっていますが、現在のところ、開始する唯一の方法は、フォームの [開始] ボタンを手動で押すことです。コードをバージョン 4.0 の .NET Framework にデプロイしようとするとエラーが発生するようですが、3.5 に設定するとこの問題は解決します。F2 ホットキーが問題なく機能しているにもかかわらず、F1 ホットキーが機能しない理由がわからないため、コード全体を以下に含めました。御時間ありがとうございます。このコードのかなりの部分は、他の人の作品の例を見て思いついたもので、ある程度しか理解できません。私はこのサイトを初めて使用し、正しく貼り付ける方法を正確に理解していないため、コードが正しくフォーマットされていることを願っています. 事前にご協力いただき、誠にありがとうございます。

Public Class Form1
Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vkey As Long) As Integer
Private Declare Sub mouse_event Lib "user32.dll" (ByVal dwflags As Long, ByVal dx As Long, ByVal cbuttons As Long, ByVal dy As Long, ByVal dwExtraInfo As Long)
Dim hotkey1 As Boolean
Dim hotkey2 As Boolean
Private Const mouseclickup = 4
Private Const mouseclickdown = 2
Dim Test As Integer
Dim Interval As Integer
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    Click.Start()
End Sub

Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
    Click.Stop()
End Sub

Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    Test = Test + 1
    Counter.Text = Test
End Sub

Private Sub Click_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Click.Tick
    Interval = CInt(timeTextbox.Text)
    Click.Interval = Interval
    mouse_event(mouseclickdown, 0, 0, 0, 0)
    mouse_event(mouseclickup, 0, 0, 0, 0)
    hotkey1 = GetAsyncKeyState(Keys.F1)
    If hotkey1 = True Then
        btnStart.PerformClick()
    End If
    hotkey2 = GetAsyncKeyState(Keys.F2)
    If hotkey2 = True Then
        btnStop.PerformClick()
    End If
End Sub

Private Sub timeTextbox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timeTextbox.TextChanged
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    KeyPreview = True
End Sub

クラス終了

4

1 に答える 1

0

あなたの宣言はVB6用でした。以下に示すように、VB.Net 用にデータ型を変更する必要があります。

また、2 つの独立したタイマーが必要です。1 つは、高速で実行する必要があるキー押下を検出するためのものです。もう 1 つは実際のクリックを行うためのもので、そのレートは TextBox の値によって決まります。

Public Class Form1

    Private Const MOUSEEVENTF_LEFTDOWN As Integer = &H2
    Private Const MOUSEEVENTF_LEFTUP As Integer = &H4

    Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As System.Windows.Forms.Keys) As Short

    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, _
        ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, _
        ByVal dwExtraInfo As Integer)

    Private WithEvents KeyTimer As New Timer

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        KeyTimer.Interval = 50
        KeyTimer.Start()

        Click.Enabled = False
    End Sub

    Private Sub KeyTimer_Tick(sender As Object, e As System.EventArgs) Handles KeyTimer.Tick
        If IsKeyDown(Keys.F1) Then
            Click.Start()
        ElseIf IsKeyDown(Keys.F2) Then
            Click.Stop()
        End If
    End Sub

    Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
        Static Test As Integer
        Test = Test + 1
        Counter.Text = Test
    End Sub

    Private Sub timeTextbox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timeTextbox.TextChanged
        Dim Interval As Integer
        If Integer.TryParse(timeTextbox.Text, Interval) Then
            Click.Interval = Interval
        End If
    End Sub

    Private Sub Click_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Click.Tick
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    End Sub

    Private Function IsKeyDown(ByVal key As System.Windows.Forms.Keys) As Boolean
        Return ((GetAsyncKeyState(key) And &H8000) = &H8000)
    End Function

End Class
于 2013-11-11T08:10:08.633 に答える