VB Problem (Mouse Recorder)

10/10/2011 01:45 bussdee#1
Hallo Community!

Ich bin en Frischling was VB angeht und versuche nun einen Autoclicker zu programmieren. Dieser soll natürlich das Mouse-Movement, die Klicks aufzeichnen und zusätzlich die Funktionen haben einen Delay zwischen den Loops zu setzen.

Leider habe ich irgendwie derzeit ein Brett vorm Kopf und mein Loop will einfach nicht so wie ich es möchte und läuft UNENDLICH. Freue mich also über jede Art von Tips die mir helfen !


Code:
     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayTimer.Tick
        If ListBox1.Text = "-32767" Or ListBox1.Text = "-32768" Then
            mouse_event(mouseclickdown, 0, 0, 0, 0)
            mouse_event(mouseclickup, 0, 0, 0, 0)
        End If
        If ListBox3.Text = "Left" Then
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        ElseIf ListBox3.Text = "Right" Then
            mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
        ElseIf Not ListBox3.Text = "Left" And Not ListBox3.Text = "Right" Then
            Cursor.Position = New Point(ListBox2.Text, ListBox3.Text)
        End If
        Try
            ListBox1.SelectedIndex = ListBox2.SelectedIndex + +1
            ListBox2.SelectedIndex = ListBox2.SelectedIndex + +1
            ListBox3.SelectedIndex = ListBox3.SelectedIndex + +1

        Catch ex As Exception

            If CheckBox1.Checked Then '  comment
                'PlayTimer.Stop()
                For i = 1 To CInt(TextBox2.Text)
                    If i < CInt(TextBox2.Text) Then
                        delay(TextBox1.Text)
                        ListBox2.SelectedIndex = 0
                        ListBox3.SelectedIndex = 0
                        PlayTimer.Start()
                    ElseIf i >= CInt(TextBox2.Text) Then
                        PlayTimer.Stop()
                    End If
                Next i

            End If

        End Try
    End Sub
Textbox 1 = Anzahl der Schleifen
Textbox 2 = Zeit bis Neustart
Checkbox 1 = Schleifen aktivieren
10/10/2011 06:24 sepei#2
Mal ne Frage dir ist klar das du das Progamm textbox1 s wartenlässt und textbox 2 mal durchlaufen lässt. Zudem i kann nicht größer werden als der inhalt von textbox2
Aber natürlich noch keine Problemlösung.
Wie groß hast du den das Interval beim timer gesetzt?
Bist du dir auch sicher das dein programm im ex bereich kommt?
10/10/2011 07:47 bussdee#3
Code:
Public Class Form1
#Region "DIMS"
    Dim result As Integer
    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Short
    Dim curclicks = 0
    Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute move
    Private Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down
    Private Const MOUSEEVENTF_LEFTUP = &H4 ' left button up
    Private Const MOUSEEVENTF_MOVE = &H1 ' mouse move
    Private Const MOUSEEVENTF_MIDDLEDOWN = &H20
    Private Const MOUSEEVENTF_MIDDLEUP = &H40
    Private Const MOUSEEVENTF_RIGHTDOWN = &H8
    Private Const MOUSEEVENTF_RIGHTUP = &H10
    Private Declare Sub mouse_event Lib "user32" (ByVal dwflags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cbuttons As Long, ByVal dwExtraInfo As Long)
    Private Const mouseclickup = 4
    Private Const mouseclickdown = 2


#End Region
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RecorderTimer.Tick
        Dim Mouse As Point = Control.MousePosition
        If GetAsyncKeyState(MOUSEEVENTF_LEFTDOWN) Then
            ListBox2.Items.Add("Left")
            ListBox3.Items.Add("Right")
        ElseIf GetAsyncKeyState(MOUSEEVENTF_RIGHTDOWN) Then
            ListBox2.Items.Add("Right")
            ListBox3.Items.Add("Right")
        Else
            ListBox2.Items.Add(Mouse.X)
            ListBox3.Items.Add(Mouse.Y)
        End If
        ListBox1.Items.Add(GetAsyncKeyState(1))
    End Sub

    Private Sub delay(ByVal zeit As Integer)
        Dim zeit1 As Integer = System.Environment.TickCount
        While (System.Environment.TickCount - zeit1) < zeit
            Application.DoEvents()
        End While
    End Sub

    Private Sub looper()
        Dim schleife As Integer = CInt(TextBox2.Text)
        If CheckBox1.Checked = True Then
            For i As Integer = 1 To schleife
                If i <= schleife Then
                    restart()
                ElseIf i > schleife Then
                    MsgBox("Done !   ... max loops reached")
                End If
            Next i
        ElseIf CheckBox1.Checked = False Then
            MsgBox("Done !  ... no loop activated")
        End If
    End Sub

    Private Sub restart()
        ListBox2.SelectedIndex = 0
        ListBox3.SelectedIndex = 0
        delay(3000)
        MsgBox("New Start")
    End Sub


    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayTimer.Tick
        If ListBox1.Text = "-32767" Or ListBox1.Text = "-32768" Then
            mouse_event(mouseclickdown, 0, 0, 0, 0)
            mouse_event(mouseclickup, 0, 0, 0, 0)
        End If
        If ListBox3.Text = "Left" Then
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        ElseIf ListBox3.Text = "Right" Then
            mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
        ElseIf Not ListBox3.Text = "Left" And Not ListBox3.Text = "Right" Then
            Cursor.Position = New Point(ListBox2.Text, ListBox3.Text)
        End If
        Try
            ListBox1.SelectedIndex = ListBox2.SelectedIndex + +1
            ListBox2.SelectedIndex = ListBox2.SelectedIndex + +1
            ListBox3.SelectedIndex = ListBox3.SelectedIndex + +1

        Catch ex As Exception
            PlayTimer.Stop()
            looper()

        End Try
    End Sub

Also irgendwie ist der Wurm drin, desshalb hier noch einmal der "komplette" neue Code.

Eigentlich soll er folgendes tun:
1. ich zeichne etwas auf
2. Programm wird gestartet durch den Button -> PlayTimer.Start()
3. Nachdem er die erste Aufnahme abgespielt hat startet der "looper" nd falls Schleifen gewünscht sind soll alles von Vorne anfangen nach einem DELAY

... wenn ich wie hier im Code MsgBox("New Start") einfüge verhällt sich das Programm genau so wie ich es haben möchte
... füge ich allerdings PlayTimer.Start() an diese Stelle ein, um die Aufzeichnung erneut zu starten, wird es eine ENDLOSSCHLEIFE !!!