mauspositionen im array speichern

  • Hi

    ich bin dabei, ein Programm zu schreiben, was die Mausbewegungen und klicks speichert, um es nacherher wieder abzuspielen.
    Bisher habe ich nur die mausklicks fertig

    ->jede millisekunde wird ein neuer wert in ein array gepackt (wenn linke maustaste gedrückt ist dann der wert "1", wenn nicht dann der wert "0")

    Schaut euch mal den Code an un testet diesen dann. Gebt z.B. 2 Sekunden an und schaut beim rekorden auf die uhr.
    Es dauert viel länger. Das ist natürlich ein großes Problem, weil dann die Position auch anders ist.

    Weiß einer eine Lösung bzw. eine Alternative?

    Code:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <misc.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $maus = 0;wenn 1, dann wird gespeichert
    Global $position = 0
    Global $speicherung = 0
    Global $zeit = 0
    Global $mausarray[1]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=E:\Andere Programme\AutoIT\AutoIt3\Tests\MouseRecorder\fenster.kxf
    $Form1 = GUICreate("MouseRecorder", 407, 383, 191, 123)
    $Label1 = GUICtrlCreateLabel("Mit diesem Programm werden alle Bewegungen der Maus aufgezeichnet", 16, 16, 379, 66)
    GUICtrlSetFont(-1, 12, 400, 0, "Minion Pro SmBd")
    GUICtrlSetColor(-1, 0xFF0000)
    $Group1 = GUICtrlCreateGroup("Einstellungen", 8, 96, 177, 137)
    $Checkbox2 = GUICtrlCreateCheckbox("Speichern von Mausklicks", 24, 120, 145, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Checkbox3 = GUICtrlCreateCheckbox("Speichern der Mausposition", 24, 144, 153, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Label3 = GUICtrlCreateLabel("Aufnahme - Dauer in Sekunden:", 24, 176, 157, 17)
    $Dauer = GUICtrlCreateInput("0", 24, 200, 153, 21, BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button2 = GUICtrlCreateButton("Aufnahme Beginnen", 8, 328, 177, 33, $WS_GROUP)
    GUICtrlSetBkColor(-1, 0x800000)
    $Group2 = GUICtrlCreateGroup("Aufnahme", 208, 96, 177, 105)
    $Label4 = GUICtrlCreateLabel("Mausklicks-Dauer in Ms:", 224, 120, 148, 17)
    $Label6 = GUICtrlCreateLabel("0", 224, 168, 87, 17)
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    $Label7 = GUICtrlCreateLabel("Sekunden", 320, 168, 53, 17)
    $Label5 = GUICtrlCreateLabel("0", 224, 144, 146, 17)
    GUICtrlSetColor(-1, 0xFF0000)
    GUICtrlSetBkColor(-1, 0xFFFF00)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Speichern", 208, 224, 177, 33, $WS_GROUP)
    GUICtrlSetBkColor(-1, 0x008000)
    $Button3 = GUICtrlCreateButton("Abspielen", 208, 328, 177, 33, $WS_GROUP)
    $Button4 = GUICtrlCreateButton("Hilfe", 208, 272, 177, 33, $WS_GROUP)
    $Group3 = GUICtrlCreateGroup("Hinweiß", 8, 240, 177, 81)
    $Label2 = GUICtrlCreateLabel("Nicht mir der Aufnahme über-", 16, 264, 141, 17)
    $Label8 = GUICtrlCreateLabel("treiben, sonst kann es zu Fehlern", 16, 280, 160, 17)
    $Label9 = GUICtrlCreateLabel("führen!", 16, 296, 37, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1

    [/autoit] [autoit][/autoit] [autoit]

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button2
    aufnahme()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func check()
    If GUICtrlRead($Dauer) = "0" Then;wenn keine dauer angegeben ist
    MsgBox(0,"Hinweiß","Es keine Dauer eingestellt")

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($Checkbox2) = $GUI_UNCHECKED And GUICtrlRead($Checkbox3) = $GUI_UNCHECKED Then;wenn keine checkbox ausgewählt ist
    MsgBox(0,"Hinweiß","Es ist keine Checkbox angewählt!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then;wenn Mausklicks gespeichert werden variable setzen
    $maus = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($Checkbox3) = $GUI_CHECKED Then;wenn Positionen gespeichert werden variable setzen
    $position = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $zeit = GUICtrlRead($Dauer)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func aufnahme()
    check()
    If $maus = 1 Then
    Sleep(500)
    $zeit = $zeit * 1000
    $klick = 0
    while 1

    [/autoit] [autoit][/autoit] [autoit]

    if _IsPressed(01) Then
    _ArrayAdd($mausarray,"1")
    $klick = $klick + 1
    Else
    _ArrayAdd($mausarray,"0")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($Label5, $klick)

    [/autoit] [autoit][/autoit] [autoit]

    $zeit = $zeit - 1
    If $zeit = 0 Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay( $mausarray, "Whole array" )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von RaYder04 (7. September 2009 um 16:43)

  • Na das liegt an Deiner Schleife, da werden viele Dinge ausgeführt die Zeit kosten, und mit
    "$zeit = $zeit - 1" wäre es Zufall, wenn der Schleifendurchlauf genau eine Sekunde dauert ....

    Mein Tip:
    1. Den Check nur einmal nach Verlassen des GUI aufrufen
    2. While Schleife, aus der per TimerInit()/TimerDiff eine Funktion aufgerufen wird
    3. in der Funktion MouseGetPos aufrufen und Ergebnis speichern
    4. in der Funktion Tasten abfragen und Ergebnis speichern

  • Bei "$zeit = $zeit - 1" wird immer 1 ms von $zeit subtrahiert.

    Mh, die Schleife kann man schlecht kleiner machen-.-
    gibs vlt. eine andere alternative?

  • habe ich einen denkfehler? xD
    also eingabe: 2 Sekunden
    ---------------------------
    (variable $zeit = 2)
    ---------------------------
    $zeit = $zeit * 1000
    ---------------------------
    (variable $zeit = 2000)
    ---------------------------
    while 1
    $zeit = $zeit - 1
    Wend

  • JA !!

    Du kannst die Variable auch Müsli nennen, aber es wird nur eine Rechenoperation ausgeführt, und keine Zeit gemessen.
    Und wenn Du in der Schleife z.B. eine Internetseite aufrufen würdest, würde das zwar genau 2000 Mal passieren, aber
    vermutlich würde es etwas länger dauern ;)

  • Klar..... ich bin in Eile, deshalb mal Progi-Slang 8)

    - den Check baust Du in die Switch-Anweisung Deiner GUI ein
    wenn Button BlaBla THEN Check()
    IF alles OK Then weiter
    ELSE wieder GUI

    - Hauptprogramm

    $begin = TimerInit()

    while 1
    $dif = TimerDiff($begin)
    IF $dif > $zeit * 1000 THEN mouse()
    sleep(100); wegen der Prozessor-Auslastung
    wend

    func mouse()
    $pos = MouseGetPos()
    $status_taste = ???????? ; bastel mal
    mousearray[$zaehelr][$pos[0]][$pos[1][$status_taste]
    $zaehler += 1
    $begin = TimerInit()
    endfunc


    so etwa ............