OnExit() / OnExit

Bestimmt eine Callback-Funktion oder Subroutine, die automatisch ausgeführt werden soll, wenn das Skript beendet wird.

OnExit() [v1.1.20+]

OnExit(Func , HinzufügenEntfernen)

Parameter

Func

Ein Funktionsname oder Funktionsobjekt, die aufgerufen werden sollen, wenn das Skript beendet wird. Optional kann die Funktion Parameter definieren, wie unten gezeigt. Wenn eine OnExit-Funktion einen Integer ungleich Null zurückgibt, wird das Skript nicht beendet (mit einigen seltenen Ausnahmen) und es werden keine weiteren Funktionen aufgerufen. Ansonsten wird das Skript beendet, nachdem alle registrierten Funktionen aufgerufen wurden.

ExitFunk(ExitGrund, ExitCode)
HinzufügenEntfernen

Wenn dieser Parameter weggelassen wird oder leer ist, wird standardmäßig 1 (die Funktion nach anderen zuvor registrierten Funktionen aufrufen) verwendet. Ansonsten können Sie eine der folgenden Zahlen angeben:

Wenn ein Label (Subroutine) registriert wurde, wird das immer zuerst aufgerufen.

Bemerkungen

Neue Skripte sollten eine Funktion anstelle einer Subroutine verwenden, um so das Risiko zu verringern, ein Skript zu erstellen, das nicht beendet werden kann, und um sicherstellen zu können, dass der übergebene Exitcode an Exit oder ExitApp beibehalten wird.

Es können beliebig viele OnExit-Funktionen registriert werden. Wenn zusätzlich noch ein Label (Subroutine) registriert wurde, werden die Funktionen aufgerufen, nachdem die Subroutine ExitApp aufgerufen hat. Eine OnExit-Funktion sollte in der Regel nicht ExitApp aufrufen; wäre dies der Fall, würde das Skript sofort terminiert werden.

OnExit

Veraltet: Dieser Befehl ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen die OnExit-Funktion.

OnExit , Label

Parameter

Label

Lässt man diesen Parameter weg, wird jedes zuvor registrierte Label deregistriert. Ansonsten kann der Name eines Labels angegeben werden, dessen Inhalt ausgeführt werden soll (als neuer Thread), wenn das Skript auf beliebige Weise beendet wird.

Bemerkungen

WICHTIG: Anstatt das Skript zu terminieren, wird die angegebene Subroutine aufgerufen - das heißt, dass der ExitApp-Befehl in dieser Subroutine verwendet werden muss, wenn man das Skript terminieren will.

Die interne Variable A_ExitReason enthält nur einen Wert, wenn die OnExit-Subroutine entweder gerade läuft oder mindestens einmal aufgrund eines vorherigen Exitversuchs aufgerufen wurde. Wenn dies der Fall ist, enthält die Variable eines der Wörter aus der unteren Tabelle.

Bemerkungen

Die Callback-Funktion oder Subroutine von OnExit wird aufgerufen, wenn das Skript in irgendeiner Form beendet wird (nur nicht, wenn das Beenden von so etwas wie "Task beenden" erzwungen wird). Sie wird auch aufgerufen, wann immer #SingleInstance und Reload eine ältere Instanz zum Terminieren auffordert.

Mit OnMessage(0x0011, "WM_QUERYENDSESSION") kann das Herunterfahren oder Abmelden des Betriebssystems erkannt und optional abgebrochen werden (siehe OnMessage-Beispiel #2 für ein funktionsfähiges Beispiel).

Der OnExit-Thread nimmt keine Rücksicht auf #MaxThreads (er wird bei Bedarf immer gestartet). Darüber hinaus kann dieser Thread, während er läuft, nicht von anderen Threads unterbrochen werden, einschließlich Hotkeys, benutzerdefinierte Menüpunkte und zeitgesteuerte Subroutinen. Allerdings wird er unterbrochen (und das Skript terminiert), wenn der Benutzer den Menüpunkt Exit im Tray-Menü oder Hauptmenü auswählt, oder das Skript aufgrund von Reload oder #SingleInstance zum Terminieren aufgefordert wird. Aus diesem Grund sollte die Callback-Funktion oder Subroutine von OnExit so gestaltet werden, dass sie schnell zum Ende kommen kann, sofern der Benutzer das nicht will.

Wenn der OnExit-Thread auf einen fehlerhaften Zustand wie z. B. Laufzeitfehler stößt, wird das Skript terminiert. Dadurch wird verhindert, dass das Skript aufgrund einer fehlerhaften Callback-Funktion oder Subroutine von OnExit nicht mehr terminiert werden kann.

Wenn der OnExit-Thread via Exit oder ExitApp inklusive Exitcode gestartet wurde, wird in [v1.1.19] und niedriger dieser Code ignoriert und verworfen. In [v1.1.20+] wird der initiale Exitcode verwendet, es sei denn, der Exitcode wurde durch Aufrufen von ExitApp mit einem neuen überschrieben.

Jede via Exitversuch gestartete Callback-Funktion oder Subroutine verwendet vorerst die Standardwerte von Einstellungen wie SendMode. Diese Standardwerte können im automatischen Ausführungsbereich geändert werden.

Exit-Gründe

Grund Beschreibung
Logoff Der Benutzer meldet sich ab.
Shutdown Das System wird heruntergefahren oder neu gestartet (z. B. mit dem Shutdown-Befehl).
Close

Das Skript hat eine WM_CLOSE- oder WM_QUIT-Meldung empfangen, hatte einen kritischen Fehler, oder wurde auf andere Weise geschlossen. Obwohl all diese Ursachen ungewöhnlich sind, wird WM_CLOSE eventuell ausgelöst, wenn man WinClose auf das Hauptfenster des Skripts anwendet. Um das Fenster zu schließen (zu verstecken), ohne das Skript zu terminieren, verwenden Sie WinHide.

Wenn das Skript wegen eines kritischen Fehlers oder der Zerstörung des Hauptfensters beendet wird, wird es nach Abschluss des OnExit-Threads bedingungslos terminiert.

Wenn das Hauptfenster zerstört wird, ist es möglicherweise noch vorhanden, kann aber nicht angezeigt werden. Dieser Zustand kann durch Überwachung der WM_DESTROY-Meldung mittels OnMessage() erkannt werden.

Error Ein Laufzeitfehler ist in einem Skript aufgetreten, das weder Hotkeys hat noch persistent ist. Ein Laufzeitfehler ist beispielsweise ein Run/RunWait, der das angegebene Programm oder Dokument nicht öffnen kann.
Menu Der Benutzer hat Exit im Hauptfenster-Menü oder voreingestellten Tray-Menü ausgewählt.
Exit Es wurden der Exit- oder ExitApp-Befehl verwendet (einschließlich benutzerdefinierte Menüpunkte).
Reload Das Skript wird via Reload-Befehl oder -Menüpunkt neu geladen.
Single Das Skript wird aufgrund von #SingleInstance mit einer neuen Instanz von sich selbst ersetzt.

OnError(), OnMessage(), RegisterCallback(), OnClipboardChange(), OnClipboardChange-Label, ExitApp, Shutdown, #Persistent, Threads, Gosub, Return, Menu

Beispiele

Funktion vs. Befehl.

Trotz der unterschiedlichen Herangehensweise haben beide Beispiele den gleichen Effekt: Sie fragen den Benutzer vor dem Beenden des Skripts. Um diese zu testen, klicken Sie mit der rechten Maustaste auf das Tray-Symbol und dann auf Exit.

#Persistent  ; Verhindert, dass sich das Skript automatisch beendet.
OnExit("ExitFunk")

ExitFunk(ExitGrund, ExitCode)
{
    if ExitGrund not in Logoff,Shutdown
    {
        MsgBox, 4, , Wollen Sie das Skript wirklich beenden?
        IfMsgBox, No
            return 1  ; OnExit-Funktionen müssen ungleich null zurückgeben, um ein Exit zu verhindern.
    }
    ; Rufen Sie ExitApp nicht auf -- dies würde verhindern, dass andere OnExit-Funktionen aufgerufen werden können.
}
#Persistent  ; Verhindert, dass sich das Skript automatisch beendet.
OnExit, ExitSub  
return

ExitSub:
if A_ExitReason not in Logoff,Shutdown  ; Vermeiden Sie in dieser Zeile Leerzeichen neben dem Komma.
{
    MsgBox, 4, , Wollen Sie das Skript wirklich beenden?
    IfMsgBox, No
        return
}
ExitApp  ; Ein Skript mit einer OnExit-Subroutine wird nicht terminiert, solange die Subroutine kein ExitApp verwendet.

Registriert ein Objekt, das bei Exit aufgerufen werden soll.

#Persistent  ; Verhindert, dass sich das Skript automatisch beendet.
OnExit(ObjBindMethod(MeinObjekt, "Beenden"))

class MeinObjekt
{
    Beenden()
    {
        MsgBox, MeinObjekt räumt vor dem Beenden auf...
        /*
        this.SageAufWiedersehen()
        this.SchließeNetzwerkVerbindungen()
        */
    }
}