ist es moeglich dass ein autoitscript pausiert wenn die maus bewegt(benutzt) wird?

  • moin!

    die Ueberschrift sagt ja schon einiges ueber meine Frage...

    da mein script auch einige mouseclicks etc verwendet und ich immer wieder irritiert bin wenn mir die maus geklaut wird 8| , wollte ich fragen ob es moeglich ist dass das autoitscript warten kann, wenn ich die maus benutze? schliesslich bin ICH doch der chef am computer :P
    Vielen Dank fuer Hilfe und Tipps!

  • Hallo Günter,

    ich kenn dein Skript nicht deswegen ganz kurz: sicher ist sowas möglich, du musst nur einen Schalter einbauen, der dein Skript veranlasst zu pausieren, aber nicht vergessen wieder zu aktivieren, wenn das Skript wieder weiter arbeiten soll. :D

    mfg (Auto)Bert

  • danke fuer deine antwort...
    meine frage bezog sich auch auf diesen "schalter" wie du es nennst.
    ich meinte eine loesung die auf zb einen hotkey verzichtet, sonst koennte ich ja auch "pause" druecken und dann wieder fortsetzen.

  • versuchs doch mal mit

    [autoit]


    while mousemove
    sleep(1)
    wend

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

    ;;;;;;;oder fallls das ncih ghet ist ncih getestet
    while 1
    if mousemove then
    sleep(1)
    endif

    [/autoit]


    wend

    ;oder zumindest so in der art^^

  • Ne du musst ständig die MousePosition abfragen (-> MouseGetPos) und falls sich die in einer bestimmten zeit verändert pausiert sich ebn das script..

  • Das ist quatsch.*edit> Das von Sithlord95) Was du bräuchtest, wäre eine Funktion MouseMoving()
    Versuch:

    [autoit]


    Func _MouseMoving($sek)
    $mgp1=MouseGetPos()
    $Time=TimerInit()
    Do
    sleep(10)
    Until TimerDiff($Time) > $sek*1000
    $mgp2=MouseGetPos()
    If $mgp1[0]=$mgp2[0] Or $mgp1[1]=$mgp2[1] Then return False
    Return True
    EndFunc

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Ich hab mal nen Beispiel gemacht ;):

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    Global $x = 2*(@DesktopWidth/10), $y = 2*(@DesktopHeight/10), $escape = 1, $PosBuff, $diff = 0
    Local $sFile = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Examples\GUI\logo4.gif"

    $pic = GUICreate("", 169, 68, 10, 30, $WS_POPUP, $WS_EX_LAYERED)
    $basti_stay = GUICtrlCreatePic($sFile, 0, 0, 169, 68)
    GUISetState(@SW_Show)
    $pos1 = MousegetPos()

    While 1
    Switch Mod($escape, 5)
    Case 0
    $escape += 1
    Case 1
    $x += 5
    If $x > @DesktopWidth - 4*(@DesktopWidth/10) Then
    $escape += 1
    EndIf
    Case 2
    $y += 5
    If $y > @DesktopHeight - 4*(@DesktopHeight/10) Then
    $escape += 1
    EndIf
    Case 3
    $x -= 5
    If $x < 2*(@DesktopWidth/10) Then
    $escape += 1
    EndIf
    Case 4
    $y -= 5
    If $y < 2*(@DesktopHeight/10) Then
    $escape += 1
    EndIf
    EndSwitch
    $pos2 = MousegetPos()
    ControlMove("", "", $pic, $x, $y)
    sleep(10)
    While $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1]
    sleep(10)
    $time = TimerInit()
    While $diff < 1000
    $diff = TimerDiff($time)
    $Pos1 = MousegetPos()
    sleep(50)
    If $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1] Then
    $diff = 0
    $pos2 = MouseGetPos()
    EndIf
    Wend
    $pos2 = MouseGetPos()
    $diff = 0
    Wend
    Wend

    [/autoit]

    2 Mal editiert, zuletzt von ChaosKeks (25. April 2009 um 19:54)

  • danke Chaoskeks fuer dein beispiel und danke auch den anderen fuer deren kommentare.
    das war genau das was ich gesucht habe, auch wenn ich jetzt tuefteln muss wo und wie ich das integrieren kann. da ich nicht so viel ahnung habe ist es mehr ein try und error fuer mich. erstmal herausbekommen welcher teil des beispiels fuer die pause verantwortlich ist...
    Aber erstmal vielen dank!

  • Hmm du kannst im Prinzip das meißte der While schleife übernehmen...

    Spoiler anzeigen
    [autoit]

    $pos1 = MousegetPos()
    While 1
    $pos2 = MousegetPos()
    ;===============================
    ControlMove("", "", $pic, $x, $y); Hier kommt dein Script hin!
    ;===============================
    sleep(10)
    While $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1]
    sleep(10)
    $time = TimerInit()
    ;=================
    While $diff < 1000; 1000ms ist die Zeit die gewartet wird, bis das Script weiterläuft (falls die Maus nicht bewegt wurde)
    ;=================
    $diff = TimerDiff($time)
    $Pos1 = MousegetPos()
    sleep(50)
    If $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1] Then
    $diff = 0
    $pos2 = MouseGetPos()
    EndIf
    Wend
    $pos2 = MouseGetPos()
    $diff = 0
    Wend
    Wend

    [/autoit]
  • Chaoskeks dein beispiel ist echt super. ich bin wirklich total begeistert!
    um es zu verstehen habe ich einfach mal die Bewegungsform (das Viereck) deines Autoit logos mit mousemove nachgemacht und ne msgbox eingebaut um zeit fuer nen Abbruch zu haben.Nicht lachen, aber so habe ich versucht es zu verstehen.
    Leider scheint es so, dass trotz eigener bewegung mit der maus das skript nicht gerne pausiert. Nicht gerne habe ich geschrieben, weil nach 2x( msgbox+4xmove) das skript aufzuhalten ist. Nichts desto trotz konnte ich dein beispiel nicht reproduzieren,warum auch immer.
    Vielleicht kannst du oder gerne auch jemand anders mal drueberschauen.

    [autoit]

    Global $diff = 0
    $pos1 = MousegetPos()

    While 1
    $pos2 = MousegetPos()

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

    MsgBox(0,"","",5)
    MouseMove(100,100)
    MouseMove(700,100)
    MouseMove(700,700)
    MouseMove(100,700)


    sleep(10)
    While $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1]
    sleep(10)
    $time = TimerInit()
    While $diff < 1000
    $diff = TimerDiff($time)
    $Pos1 = MousegetPos()
    sleep(50)
    If $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1] Then
    $diff = 0
    $pos2 = MouseGetPos()
    EndIf
    Wend
    $pos2 = MouseGetPos()
    $diff = 0
    Wend
    Wend

    [/autoit]


    Viele Gruesse

  • Hi Günther!
    Also Autoit arbeitet immer zeilenweise: Ist der eine Befehl abgearbeitet, wird der nächste ausgeführt..
    In deinem Script wurden die 4 Befehle (MouseMove) durchgeführt und dann am Schluss wurde erst abgefragt, ob das Script pasieren soll, da der User die Maus bewegt. Zusätzlich erschwerend ist natürlich das du in dem Beispiel MouseMove verwendest, da die Funktion solange nicht nachgibt, bis ihr Ziel erreicht wurde..da kannstu soviel an der Maus rütteln wie du willst ;)
    Also muss man die Schleife zwischendurch unterbrechen, um zu checken ob du jetzt die maus bewegst oder das script.. und dafür gibt es AdlibEnable!

    Es ist zwar nicht perfekt, da du immernoch nicht die Maus bewegen kannst während grade das script in einem mousemove drinnen ist (dazu müsstest du einen MouseMove pro pixel machen) aber es ist schonmal wesentlich leichter:

    Spoiler anzeigen
    [autoit]

    Global $diff = 0, $pos1 = MousegetPos()
    hotkeyset("a","Terminate")
    adlibenable("MouseIsMoving", 100)

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

    While 1
    MouseMove(100,100)
    MouseMove(700,100)
    MouseMove(700,700)
    MouseMove(100,700)
    $pos1 = MousegetPos()
    sleep(10)
    Wend

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

    Func MouseIsMoving()
    sleep(10)
    $pos2 = MousegetPos()
    While $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1]
    sleep(10)
    $time = TimerInit()
    While $diff < 1000
    $diff = TimerDiff($time)
    $Pos1 = MousegetPos()
    sleep(50)
    If $Pos1[0] <> $Pos2[0] And $Pos1[1] <> $Pos2[1] Then
    $diff = 0
    $pos2 = MouseGetPos()
    EndIf
    Wend
    $pos2 = MouseGetPos()
    $diff = 0
    Wend
    EndFunc

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

    Func Terminate()
    Exit
    EndFunc

    [/autoit]
  • Das reicht voellig aus und ist eine super Loesung fuer mich!
    Da ich Beispielskripte aus dem Forum in nem Ordner sammel, wollte ich nochmal fragen ob man das auch innerhalb einer Funktion einsetzen kann und wenn ja wie.
    Ausserdem interessiert mich ob man es wenn man ein grosses Skript mit vielen Funktionen, whileschleifen, if-then schreibt, mehrmals einfuegen muss, oder ob man es generalisieren kann, so dass es immer funktioniert(im Moment ists ja nur fuer eine einzige Whileschleife und ohne Func).
    Tut mir leid, dass ich so viel frage, aber ich versuche mir das Thema und die Moeglichkeiten von autoit mehr und mehr zu erschliessen.
    Vielen herzlichen Dank nochmal fuer die tolle Hilfe!

    • Offizieller Beitrag

    Man kann das Ganze auch anders lösen:

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $hGui = GUICreate('Test', 300, 200)
    $hCounter = GUICtrlCreateLabel('0', 20, 20, 100, 20) ; ist nur ein Beispiel
    GUISetState()
    Global $Timer = TimerInit(), $iCount = 0
    GUIRegisterMsg($WM_MOUSEMOVE, 'MY_WM_MOUSEMOVE') ; Funktion registrieren für Mausbewegung
    Do
    If TimerDiff($Timer) > 2000 Then ; wenn 2 sekunden lang die Maus nicht bewegt wird, dann...
    $iCount += 1 ; Counter um eins erhöhen
    GUICtrlSetData($hCounter, $iCount) ; und Counter anzeigen (als Beispiel, damit in der Schleife etwas passiert)
    EndIf
    Until GUIGetMsg() = -3

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

    Func MY_WM_MOUSEMOVE() ; Funktion wird aufgerufen, wenn die Maus bewegt wird
    $Timer = TimerInit() ; Timer zurücksetzen
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Letztendlich kommt es aber auf den Verwendungszweck an. Also was Du innerhalb der Schleife machen willst.
    Beachten solltest Du nur, dass Du die Funktion "MY_WM_MOUSEMOVE" nicht blockieren darfst:

    Zitat


    Warning: blocking of running user functions which executes window messages with commands such as "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!

  • Auch ne top Lösung, Oscar ;P
    Aber mir ist spontan aufgefallen, dass WM_MouseMove (wie die meißten GuiRegister-Commands) nur auf Gui's funktioniert.. Kann man das irgendwie umgehen, ohne eine Bildschirmgroße transparente gui erstellen zu müssen?