TrayCreate Item, Restart, Exit

  • Hallo,
    ich versuche mit TrayCreateItem mein Programm zu beenden oder eben einen Neustart herbei zu führen, nur das Problem ist:

    Die Icons funktionieren tadelos, aber mein Skript läuft nicht an.

    Hier mal ein Pseudocode:

    [autoit]


    #NoTrayIcon
    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()
    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = 0
    ContinueLoop
    Case $msg = $Restart
    ShellExecute("D:\AutoIT\Skript.exe")
    Exit("Skriptl.exe")
    Case $msg = $Exit
    ExitLoop
    EndSelect
    WEnd
    Exit

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

    msgBox(0, "", "Hallo hier soll mein Skript hin")
    ...
    ....

    [/autoit]

    Was mache ich denn falsch?

    Ich möchte das zu jedem Zeitpukt ein Neustart oder eben ein Exit einleiten soll.

    Gruß Daniel

  • Hi!

    Also das erste, was mir auffällt ist, dass du "Exit("Skriptl.exe")" geschrieben hast, obwohl "Exit" gereicht hätte:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()
    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = 0
    ContinueLoop
    Case $msg = $Restart
    ShellExecute("D:\AutoIT\Skript.exe")
    Exit
    Case $msg = $Exit
    ExitLoop
    ;Vielleicht ein richtiges Exit statt ExitLoop? Ich bin mir nämlich nicht ganz sicher, was du erreichen willst aber naja
    EndSelect
    WEnd
    Exit

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

    msgBox(0, "", "Hallo hier soll mein Skript hin")

    [/autoit]

    Außerdem dient es der Übersicht n paar tabs einzufügen :rolleyes: Aber is deine Sache.

  • Hier mal was das funktioniert ;)

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon

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

    $restartCounter = 0
    If $cmdline[0]=1 Then $restartCounter=$cmdline[1]

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

    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()

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

    if $restartCounter > 0 Then TrayTip ( @ScriptName, "Das Script wurde bereits zum " & $restartCounter & ". mal neu gestartet.",10)

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

    While 1
    $msg = TrayGetMsg()
    Select
    ; Case $msg = 0 ; unnötig
    ; ContinueLoop
    Case $msg = $Restart
    $restartCounter += 1
    If @Compiled Then
    ;ConsoleWrite('"' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    Run('"' & @ScriptFullPath & '" ' & $restartCounter)
    Else
    ;ConsoleWrite('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter)
    EndIf
    Exit
    Case $msg = $Exit
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke.
    Wo oder wie platziere ich jetzt mein Skript(das eigentliche Skript).
    Irgendwie stehe ich auf dem Schlauch.

  • Ich vermute bei RUN nach If @Compiled.
    Was das zweite soll bin ich mir nicht sicher...vieleicht sollte dort eine Funktion rein um das Skript zu kompilieren ö.Ö

    Ich denke aber es wäre einfacher das Skript in eine Endlosschlaufe zu verpacken und dann einfach bei Restart bis auf diese Schlaufe "zurückzugehen".
    Ich würde dir übrigends raten, deine Syntax etwas lesbarer zu gestalten (einrücken) ;)

    Bild1: Ich beim debuggen

  • In AutoIT habe ich das auch, aber irgendwie wollte er das nicht mit formatieren. Sorry dafür.
    Ich kann es nämlich nicht leiden, wenn der Code unübersichtlich ist.

  • Es läuft, aber noch nicht so wie ich es mir vorgestellt habe.
    Ich möchte falls ein Fehler aufrtitt bsp. Windows meldet Datei in Benutzung oder ähnliches, sodass mein Skript nicht weiter läuft das ich trotzdem auf Restart klicken kann und das mein Skript wieder von vorne beginnt.
    Kurzfassung: Skrip wird ausgeführt---Fehlermeldung von Windows----Skript stoppt---Mit Restart neu starten.

  • Ich vermute bei RUN nach If @Compiled.
    Was das zweite soll bin ich mir nicht sicher...vieleicht sollte dort eine Funktion rein um das Skript zu kompilieren ö.Ö

    Hä? Wenn du willst, dass sich ein Script selbst neustartet, dann musst du dafür eine Fallunterscheidung zwischen kompilierten und nicht kompilierten Zustand machen, weil im nicht kompilierten Zustand nicht einfach die au3 direkt ausgeführt werden kann, sondern der autoit interpreter zum interpretieren der au3 benötigt wird. Nichts anderes mache ich an besagter Stelle. was den Neustart an sich betrifft würde ich aber auch mal den Sinn hinterfragen, denn normalerweise gibt es auch andere und bessere Wege um ein Script wieder auf Ursprungszustand zurückzusetzen.

    Da er aber bisher kein richtiges Script hat kann man auch schlecht Alternativen vorschlagen.


    Zitat von DanielZ86


    Danke.
    Wo oder wie platziere ich jetzt mein Skript(das eigentliche Skript).
    Irgendwie stehe ich auf dem Schlauch.

    Kommt ja drauf an was für ein Script. Wenn du alles per traymenü machen willst füge eben mehr Menüpunkte hinzu und rufe in deiner switch case Abfrage eine Funktion zum Menüpunkt auf.
    Wenn du zusätzlich eine GUI haben willst, dann erstell eben eine vor deiner while Schleife.

    Beispiel für neue Funktion:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon

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

    $restartCounter = 0
    If $cmdline[0]=1 Then $restartCounter=$cmdline[1]

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

    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $test = TrayCreateItem("TEST")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()

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

    if $restartCounter > 0 Then TrayTip ( @ScriptName, "Das Script wurde bereits zum " & $restartCounter & ". mal neu gestartet.",10)

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

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $Restart
    restart()
    Case $msg = $test
    meintest()
    Case $msg = $Exit
    Exit
    EndSelect
    WEnd

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

    func meintest()
    msgbox(0,"test","blahblah")
    endfunc

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

    func restart()
    $restartCounter += 1
    If @Compiled Then
    ;ConsoleWrite('"' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    Run('"' & @ScriptFullPath & '" ' & $restartCounter)
    Else
    ;ConsoleWrite('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter)
    EndIf
    Exit
    endfunc

    [/autoit]
  • Hä? Wenn du willst, dass sich ein Script selbst neustartet, dann musst du dafür eine Fallunterscheidung zwischen kompilierten und nicht kompilierten Zustand machen, weil im nicht kompilierten Zustand nicht einfach die au3 direkt ausgeführt werden kann, sondern der autoit interpreter zum interpretieren der au3 benötigt wird. Nichts anderes mache ich an besagter Stelle. was den Neustart an sich betrifft würde ich aber auch mal den Sinn hinterfragen, denn normalerweise gibt es auch andere und bessere Wege um ein Script wieder auf Ursprungszustand zurückzusetzen.

    Das habe ich eigentlich auch so gemeint 8|

    Du kannst aber ein Programm nicht beenden, und es trotzdem eine meldung anzeigen lassen. Das Skript kann in angehaltetem Zustand ja nicht überprüfen was dort gedrückt wird.

    Bild1: Ich beim debuggen

  • Es läuft, aber noch nicht so wie ich es mir vorgestellt habe.
    Ich möchte falls ein Fehler aufrtitt bsp. Windows meldet Datei in Benutzung oder ähnliches, sodass mein Skript nicht weiter läuft das ich trotzdem auf Restart klicken kann und das mein Skript wieder von vorne beginnt.
    Kurzfassung: Skrip wird ausgeführt---Fehlermeldung von Windows----Skript stoppt---Mit Restart neu starten.

    Geht natürlich auch und wäre bedeutend besser als das Script komplett zu beenden und neuzustarten. Poste doch einfach dein eigentliches Script. Am besten gleich in das Beispielscript als Funktion einbauen...

  • Geht natürlich auch und wäre bedeutend besser als das Script komplett zu beenden und neuzustarten. Poste doch einfach dein eigentliches Script. Am besten gleich in das Beispielscript als Funktion einbauen...

    In diesem Fall wäre das Programm selbst nicht gestoppt, es würde lediglich in einer endlosschleife auf einen Buttonpress warten

    Bild1: Ich beim debuggen

  • Du kannst aber ein Programm nicht beenden, und es trotzdem eine meldung anzeigen lassen.

    Klar kann ich das, aber hat ja nix mit dem Thema zu tun und ich mache auch nichts derartiges in meinen Beispielen...

    In diesem Fall wäre das Programm selbst nicht gestoppt, es würde lediglich in einer endlosschleife auf einen Buttonpress warten

    Ist ja wohl auch beabsichtigt. Er will seine Funktion im Fehlerfall neustarten, oder abbrechen können und nicht das Script ansich beenden. Zum beenden hat er schliesslich seinen exit Button im Tray... ohne seine Funktion kann ich aber auch nur spekulieren was er denn nun genau haben möchte.