need PAUSE

  • Hallo,

    ich weiß nicht genau, warum es nicht geht, aber ich brauche folgendes.
    man kann ja mit einem klick auf das autoit-trayicon das script pausieren. das ist eine super sache, klappt aber leider sehr schlecht, wenn autoit die ganze zeit die maus benutzen muss.

    Also wäre es sinnvoll, wenn man mit einem HOTKEY die gleiche funktionalität erreichen könnte.

    Also das Script arbeitet, ich drücke PAUSE, das Script macht nichts, dann drücke ich wieder PAUSE und das Script macht genau da weiter, wo es aufgehört hat.

    einfach

    [autoit]

    Func _Pause()
    Do
    Sleep(10)
    Until _IsPressed("13")
    EndFunc

    [/autoit]

    scheint nix zu bringen. Wer hat eine andere Idee/Lösung?

    Thx schonmal =)

  • Lass dein Script doch mit einem externen Script Pausieren. Hier die UDF:


    Spoiler anzeigen
    [autoit]

    Global Const $PROCESS_SUSPEND_RESUME = 0x0800
    Global Const $SYNCHRONIZE = 0x00100000
    Global Const $PROCESS_TERMINATE = 0x0001

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

    ;~ _SuspendProcess (3580)
    _ResumeProcess (3580)
    Func _TerminateProcess ($iPID)
    $vDLL = DllOpen ('Kernel32.dll')
    $vProc = DllCall ($vDLL, "hwnd", "OpenProcess", "dword", $SYNCHRONIZE + $PROCESS_TERMINATE, "int", false, "dword", $iPID)
    $vReturn = DllCall ($vDLL, "int", "TerminateProcess", "hwnd", $vProc[0], "int", 0)
    DllCall ($vDLL, "int", "CloseHandle", "hwnd", $vProc[0])
    Return $vReturn[0]
    EndFunc

    Func _ResumeProcess ($iPID)
    $vDLL = DllOpen ('Kernel32.dll')
    $vProc = DllCall ($vDLL, "hwnd", "OpenProcess", "dword", $SYNCHRONIZE + $PROCESS_SUSPEND_RESUME, "int", false, "dword", $iPID)
    $vReturn = DllCall ("ntdll.dll", "int", "NtResumeProcess", "hwnd", $vProc[0])
    DllCall ($vDLL, "int", "CloseHandle", "hwnd", $vProc[0])
    Return $vReturn[0]
    EndFunc

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

    Func _SuspendProcess ($iPID)
    $vDLL = DllOpen ('Kernel32.dll')
    $vProc = DllCall ($vDLL, "hwnd", "OpenProcess", "dword", $SYNCHRONIZE + $PROCESS_SUSPEND_RESUME, "int", false, "dword", $iPID)
    $vReturn = DllCall ("ntdll.dll", "int", "NtSuspendProcess", "hwnd", $vProc[0])
    DllCall ($vDLL, "int", "CloseHandle", "hwnd", $vProc[0])
    Return $vReturn[0]
    EndFunc

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

    func _PauseResumeThread ( $iOwnerPid, $bResume = true)
    Local Const $TH32CS_SNAPTHREAD = 0x00000004
    Local Const $THREAD_SUSPEND_RESUME = 0x0002
    Local Const $tagTHREADENTRY32 = "DWORD dwSize; DWORD cntUsage; DWORD th32ThreadID; DWORD th32OwnerProcessID; LONG tpBasePri; LONG tpDeltaPri; DWORD dwFlags;"

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

    $vDLL = DllOpen ('Kernel32.dll')

    $hThreadSnap = DllCall($vDLL , "hwnd", "CreateToolhelp32Snapshot", "dword", $TH32CS_SNAPTHREAD, "dword", 0)

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

    $vStruct = DllStructCreate ( $tagTHREADENTRY32 )
    DllStructSetData ($vStruct, "dwSize", DllStructGetSize ($vStruct))

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

    $vReturn = DllCall ($vDLL, "int", "Thread32First", "hwnd", $hThreadSnap[0], "ptr", DllStructGetPtr ($vStruct))
    if $vReturn[0] Then
    Do
    if DllStructGetData ( $vStruct, "th32OwnerProcessID") == $iOwnerPid Then
    $vThread = DllCall ($vDLL, "hwnd", "OpenThread", "dword", $THREAD_SUSPEND_RESUME , "int", false, "dword", DllStructGetData ($vStruct, "th32ThreadID"))
    if $bResume Then
    DllCall ($vDLL, "dword", "ResumeThread", "hwnd", $vThread[0])
    Else
    DllCall ($vDLL, "dword", "SuspendThread", "hwnd", $vThread[0])
    EndIf
    EndIf
    $vReturn = DllCall ($vDLL, "int", "Thread32Next", "hwnd", $hThreadSnap[0], "ptr", DllStructGetPtr ($vStruct))
    Until @error or not $vReturn[0]
    EndIf
    DllCall ($vDLL, "int", "CloseHandle", "hwnd", $hThreadSnap[0])
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Warum nimmst du nicht einfach die Beispielsfuntion aus der Hilfe von HotKeySet ?

    Spoiler anzeigen
    [autoit]

    Global $Paused
    HotKeySet("{PAUSE}", "TogglePause")

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

    Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
    sleep(100)
    ToolTip('Script is "Paused"',0,0)
    WEnd
    ToolTip("")
    EndFunc

    [/autoit]
  • Hi,
    in deinem Beispiel ist dein Script solange Pausiert, bis die Pause-Taste gedrückt wurde.
    D.h. immer wenn du die Funktion aufrufst, pausiert er ersteinmal.

    Du musst genau wie bei dem Beispiel in der HIlfe eine Globale Buffer-Variable einbauen, die prüft, ob das Script aktuell pausiert ist oder nicht und erst danach darauf reagieren.