Programm mit Zeitverzögerung ausführen / MsgBox OK/Cancel / Tray Menü Beenden

  • Erstmal Guten Morgen an alle,

    Ich bin Neueinsteiger in der Materie und wollte jetzt ein Script schreiben, dass eine MsgBox aufgehen lässt, die mit OK/Cancel abfragt, ob das Script ausgeführt werden soll. Bei OK soll dann ein Timer starten, der eine gewisse Zeit läuft und nach Ablauf der Zeit ein anderes Programm startet. Bei Cancel dann halt natürlich nicht. Während der Timer läuft, wollte ich, dass man den Timer bzw. das Script dann über das Tray-Icon beenden kann (und eventuell beim Anklicken gezeigt bekommt, wie lange der Timer noch läuft. Wenn das geht?)

    Jetzt hab ich hier im Forum mal ein bisschen was über die Suche zusammengesucht und versucht einzubauen, bin aber ziemlich kläglich gescheitert. Irgendwie funktioniert das nämlich gar nicht. =/

    Nun hoffe ich, dass ich hier einen netten Menschen finde, der mir das mal zeigen könnte (eventuell ja mit Hinweisen zu den jeweiligen Abschnitten, damit ich sehe, wie und warum das funktionieren sollte). =)

    LG

    Einmal editiert, zuletzt von kex (15. Juli 2010 um 14:54)

  • MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten")
    If Return=1
    sleep(7200000)
    ShellExecute xyz
    If Return=2
    Exit

    #NoTrayIcon
    Opt("TrayMenuMode",1)

    $timer = TrayCreateItem ("Verbleibende Zeit")
    §exit = TrayCreateItem ("Beenden")

    TraySetState()

    While1
    $msg=TrayGetMsg()
    Select
    Case$msg=0
    ContinueLoop
    Case$msg=$timer
    Msgbox(0,"Verbleibende Zeit") <- Wie bekomme ich da jetzt die Timerdiff rein?
    Case$msg=$exit
    ExitLoop
    EndSelect
    WEnd

    ?

  • Bitte stelle in Zukunft lauffähige Skripte rein. Dieses Script sieht so aus, als würdest du die Grundlagen von AutoIt nichtmal richtig kennen.
    Edit: naja, hier eine Lösung:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3> ; In der Date.au3 ist die Funktion _TicksToTime
    Opt("TrayMenuMode", 1) ; Eigenes Tray Menu
    $msg = MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten") ; Der Variable $msg wird der Rückgabewert der MsgBox zugewiesen
    If $msg=1 Then ; Wenn der Rückgabewert der MsgBox 1 ist, dann...
    $timer=TimerInit() ; Erstelle einen Timestamp
    Timer() ; rufe die Funktion Timer auf
    ShellExecute("cmd.exe") ; Rufe das Programm auf
    EndIf ; Ende vom If
    If $msg=2 Then Exit ; Wenn der Rückgabewert der MsgBox 2 ist, dann Beende
    Func Timer() ; Funktion Timer
    Local $Hour, $Min, $Sec ; Lokale Variablen
    $time = TrayCreateItem("Verbleibende Zeit") ; Erstelle das TrayItem
    $exit = TrayCreateItem("Beenden") ; Erstelle noch ein TrayItem
    While TimerDiff($timer) < 120000 ; Solange die 2 Minuten nicht vorüber sind (ich hab lieber 2 Minuten statt 2 Stunden genommen, damit man es besser testen kann)
    Switch TrayGetMsg() ; Schalter TrayGetMsg
    Case $time ; Falls $time
    _TicksToTime(120000-TimerDiff($timer), $Hour, $Min, $Sec) ; Mache aus den Ticks (Millisekunden) Stunden, Minuten und Sekunden und
    ; speichere diese in $hour, $Min und $Sec
    MsgBox(0, "Verbleibende Zeit", $Hour&" : "&$Min&" : "&$Sec) ; Zeige die verbleibenden Stunden, Minuten und Sekunden an
    Case $exit ; Falls $exit
    Exit ; Beende
    EndSwitch ; Ende vom Schalter
    WEnd ; Schleifenende
    EndFunc ;==>Timer ; Funktionsende

    [/autoit]

    Einmal editiert, zuletzt von Ineluki (15. Juli 2010 um 10:30)

  • Zitat: "Bitte stelle in Zukunft lauffähige Skripte rein. Dieses Script sieht so aus, als würdest du die Grundlagen von AutoIt nichtmal richtig kennen."

    Zitat: "Ich bin Neueinsteiger in der Materie und wollte jetzt ein Script schreiben[...]"

    So ist es. Ich danke dir trotzdem recht herzlich für die Hilfe und die Erklärung! =)


    Könnte das auch so gehen? Dass man alle paar Minuten eine MsgBox anzeigen lässt, die einen auf den Timer hinweist und dafür die Option aus dem Traymenü rausnehmen.

    [autoit]


    $msg = MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten.") ; Der Variable $msg wird der Rückgabewert der MsgBox zugewiesen
    If $msg=1 Then ; Wenn der Rückgabewert der MsgBox 1 ist, dann...
    Sleep(3600000) ; 60 Minuten später...
    MsgBox(0, "Hinweis", "Automatisches Ausführen in 60 Minuten.")
    Sleep(1800000) ; 30 Minuten später...
    MsgBox(0, "Hinweis", "Automatisches Ausführen in 30 Minuten.")
    Sleep(1500000) ; 25 Minuten später...
    MsgBox(0, "Hinweis", "Automatisches Ausführen in 5 Minuten.")
    ShellExecute("cmd.exe") ; Rufe das Programm auf
    EndIf ; Ende vom If
    If $msg=2 Then Exit ; Wenn der Rückgabewert der MsgBox 2 ist, dann Beende

    [/autoit]

    Das führt mich zu der Frage, ob man das Traymenü mit dem Punkt "Beenden" dann noch verwenden könnte? Während Sleep macht er ja normalerweise auch keine Abfragen, oder?

    Oder könnte man einfach das normale Traymenü nehmen und so ändern, dass es sich beim Anklicken nicht mehr pausiert und die Option Pause auch nicht mehr angezeigt wird? So dass quasi nur Exit übrig bleibt?

  • Wenn du die Grundlagen noch nicht beherrschst, solltest du diese ersteinmal lernen ;) Hilfreich sind


    Naja, so müsste es funktionieren:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3> ; In der Date.au3 ist die Funktion _TicksToTime
    Opt("TrayMenuMode", 1) ; Eigenes Tray Menu
    $msg = MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten") ; Der Variable $msg wird der Rückgabewert der MsgBox zugewiesen
    If $msg=1 Then ; Wenn der Rückgabewert der MsgBox 1 ist, dann...
    $timer=TimerInit() ; Erstelle einen Timestamp
    Timer() ; rufe die Funktion Timer auf
    ShellExecute("cmd.exe") ; Rufe das Programm auf
    EndIf ; Ende vom If
    If $msg=2 Then Exit ; Wenn der Rückgabewert der MsgBox 2 ist, dann Beende
    Func Timer() ; Funktion Timer
    Local $Hour, $Min, $Sec ; Lokale Variablen
    $time = TrayCreateItem("Verbleibende Zeit") ; Erstelle das TrayItem
    $exit = TrayCreateItem("Beenden") ; Erstelle noch ein TrayItem
    While TimerDiff($timer) < 120000 ; Solange die 2 Minuten nicht vorüber sind (ich hab lieber 2 Minuten statt 2 Stunden genommen, damit man es besser testen kann)
    Switch TrayGetMsg() ; Schalter TrayGetMsg
    Case $time ; Falls $time
    _TicksToTime(120000-TimerDiff($timer), $Hour, $Min, $Sec) ; Mache aus den Ticks (Millisekunden) Stunden, Minuten und Sekunden und
    ; speichere diese in $hour, $Min und $Sec
    MsgBox(0, "Verbleibende Zeit", $Hour&" : "&$Min&" : "&$Sec) ; Zeige die verbleibenden Stunden, Minuten und Sekunden an
    Case $exit ; Falls $exit
    Exit ; Beende
    EndSwitch ; Ende vom Schalter
    If 120000-TimerDiff($timer)=60000 Or 120000-TimerDiff($timer)=30000 Or 120000-TimerDIff($timer)= 15000 Then MsgBox(0, "Verbleibende Zeit", "Automatisches ausführen in "&120000-TimerDiff($timer)/1000&" Sekunden")
    WEnd ; Schleifenende
    EndFunc ;==>Timer ; Funktionsende

    [/autoit]
  • Okay, danke dir nochmal! Hab mich da jetzt mal ein bisschen umgeguckt.Mit Opt("TrayAutoPause", 0) verhindert man das Pausieren beim Klicken auf das Trayicon. =)

    Hätte aber spontan gerade noch eine Frage zur MsgBox. Muss bei einer einfachen MsgBox, die nur den OK-Button hat, auch auf OK geklickt werden, damit das Script weiter ausgeführt wird? Oder läuft das Script auch weiter, wenn man nicht auf OK klickt?
    Wenn nicht, gibt es eine Möglichkeit, dass es trotzdem weiterläuft, auch wenn nicht auf OK geklickt wird? Hab da in der Hilfe nichts zu gefunden. =/

  • Kann man verhindern, dass die MsgBox das Script stoppt? Es soll ja quasi nur der Information dienen. Eventuell mit einem anderen Befehl, der zwar die Info anzeigt, aber eben nicht pausiert?

  • Das Script wird zwar durch die MsgBox gestoppt, der Timer aber nicht.

    Jein wenn die 2. MsgBox (über Traymenü aufgerufen) nicht bestätigt wird wird das Programm trotz Ablauf der Zeit nicht gestartet, da die MsgBox die While-Schleife blockiert, deshalb besser

    [autoit]

    MsgBox(0, "Verbleibende Zeit", $Hour&" : "&$Min&" : "&$Sec,5) ; Zeige die verbleibenden Stunden, Minuten und Sekunden an die MsgBox schliesst sich nach spätestens 5 Sek. von alleine,

    [/autoit]

    mfg (Auto)Bert

  • Okay, hatte es jetzt mal mit SplashTextOn versucht, aber das Fenster, das dann aufgeht, wird man irgendwie nicht mehr los. Dann hab ich es mal so probiert:

    [autoit]


    Opt("TrayAutoPause", 0)

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

    $msg1 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten.")
    If $msg1=1 Then Sleep(3600000)
    EndIf
    If $msg1=2 Then Exit

    $msg2 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 60 Minuten.", 60000)
    If $msg2=1 Then Sleep(1800000)
    EndIf
    If $msg2=-1 Then Sleep(1740000)
    EndIf
    If $msg2=2 Then Exit
    EndIf

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

    $msg3 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 30 Minuten.", 60000)
    If $msg3=1 Then Sleep(1500000)
    EndIf
    If $msg3=-1 Then Sleep(1440000)
    EndIf
    If $msg3=2 Then Exit
    EndIf

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

    $msg4 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 5 Minuten.", 60000)
    If $msg4=1 Then Sleep(300000)
    EndIf
    If $msg4=-1 Then Sleep(240000)
    EndIf
    If $msg4=2 Then Exit
    EndIf

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

    ShellExecute("cmd.exe")

    [/autoit]

    Damit die MsgBox dann von selbst zugeht, wenn sie nicht bestätigt wird und das Script weiterläuft. Beim Test kam dann die Fehlermeldung, dass in Line 5 das EndIf keiner If-Funktion zugewiesen werden konnte und das Script wird gar nicht erst ausgeführt. Was ist denn da schief gelaufen?

  • Spoiler anzeigen
    [autoit]

    Opt("TrayAutoPause", 0)

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

    $msg1 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 120 Minuten.")
    If $msg1 = 1 Then Sleep(3600000)

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

    If $msg1 = 2 Then Exit

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

    $msg2 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 60 Minuten.", 60000)
    If $msg2 = 1 Then Sleep(1800000)

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

    If $msg2 = -1 Then Sleep(1740000)

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

    If $msg2 = 2 Then Exit

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

    $msg3 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 30 Minuten.", 60000)
    If $msg3 = 1 Then Sleep(1500000)

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

    If $msg3 = -1 Then Sleep(1440000)

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

    If $msg3 = 2 Then Exit

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

    $msg4 = MsgBox(1, "Hinweis", "Automatisches Ausführen in 5 Minuten.", 60000)
    If $msg4 = 1 Then Sleep(300000)

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

    If $msg4 = -1 Then Sleep(240000)

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

    If $msg4 = 2 Then Exit

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

    ShellExecute("cmd.exe")

    [/autoit]