OnExit

OnExit kann als Funktion oder Befehl verwendet werden, wobei Ersteres für neue Skripte empfohlen ist. Als Funktion registriert es eine Funktion, die jedes Mal automatisch aufgerufen wird, wenn das Skript beendet wird. Als Befehl registriert es eine Subroutine, die jedes Mal automatisch aufgerufen wird, wenn das Skript beendet wird.

OnExit-Funktion [v1.1.20+]

Registriert eine Funktion, die jedes Mal automatisch aufgerufen wird, wenn das Skript beendet wird.

OnExit(Rückruf , HinzufügenEntfernen)

Parameter

Rückruf

Ein Funktionsname oder Funktionsobjekt, der/das aufgerufen werden soll. Um einen Funktionsnamen zu übergeben, setzen Sie ihn in Anführungszeichen.

Die Rückruffunktion akzeptiert zwei Parameter und kann wie folgt definiert werden:

MeinRückruf(ExitGrund, ExitCode) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Der Exitgrund (eines der Wörter aus der unteren Tabelle).
  2. Der Exitcode, der an Exit oder ExitApp übergeben wurde.

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden.

Die Rückruffunktion kann einen Integer ungleich 0 zurückgeben, um zu verhindern, dass das Skript beendet wird (mit einigen seltenen Ausnahmen) und dass weitere Rückruffunktionen aufgerufen werden. Andernfalls wird das Skript beendet, nachdem alle registrierten Rückruffunktionen aufgerufen wurden.

HinzufügenEntfernen

Wenn weggelassen, wird standardmäßig 1 verwendet. Andernfalls geben Sie eine der folgenden Zahlen an:

Wenn eine Subroutine via OnExit-Befehl unten registriert wurde, wird diese Subroutine immer zuerst aufgerufen.

Bemerkungen

Es können beliebig viele Rückruffunktionen registriert werden. Wenn auch eine Subroutine registriert wurde (via OnExit-Befehl unten), werden die Rückruffunktionen aufgerufen, nachdem die Subroutine ExitApp aufgerufen hat. Eine Rückruffunktion sollte in der Regel kein ExitApp aufrufen, da sonst das Skript sofort terminiert werden würde.

OnExit-Befehl

Registriert eine Subroutine, die jedes Mal automatisch aufgerufen wird, wenn das Skript beendet wird.

Veraltet: Dieser Befehl ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen die oben beschriebene OnExit-Funktion, um das Risiko zu verringern, versehentlich ein Skript zu erstellen, das nicht beendet werden kann, und um sicherzustellen, dass der an Exit oder ExitApp übergebene Exitcode erhalten bleibt.

OnExit , Label

Parameter

Label

Wenn leer oder weggelassen, wird jede zuvor registrierte Subroutine deregistriert. Andernfalls geben Sie das Label der Subroutine an, deren Inhalt ausgeführt werden soll (als neuer Thread), sobald das Skript auf irgendeine Weise beendet wird.

Bemerkungen

Da die registrierte Subroutine aufgerufen wird, anstatt das Skript zu terminieren, muss diese Subroutine ExitApp verwenden, wenn das Skript terminiert werden soll.

Die interne Variable A_ExitReason ist leer, es sei denn, die registrierte Subroutine wird gerade ausgeführt oder wurde mindestens einmal durch einen vorherigen Exitversuch aufgerufen. Wenn dies der Fall ist, enthält die Variable eines der Wörter aus der unteren Tabelle.

Bemerkungen

Die Rückruffunktion oder Subroutine wird aufgerufen, sobald das Skript auf irgendeine Weise beendet wird (außer es wird durch so etwas wie "Task beenden" gekillt). Sie wird auch jedes Mal aufgerufen, wenn #SingleInstance oder Reload eine ältere Instanz auffordert, sich zu terminieren.

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

Der OnExit-Thread ignoriert #MaxThreads (er wird immer bei Bedarf gestartet). Außerdem kann dieser Thread, während er ausgeführt wird, nicht von anderen Threads unterbrochen werden, z.B. erzeugt durch Hotkeys, benutzerdefinierte Menüpunkte und zeitgesteuerte Subroutinen. Allerdings wird er unterbrochen (und das Skript terminiert), wenn der Benutzer "Exit" im Tray-Menü oder Hauptmenü auswählt oder wenn das Skript durch Reload oder #SingleInstance aufgefordert wurde, sich zu terminieren. Aus diesem Grund sollte die Rückruffunktion oder Subroutine so konzipiert sein, dass sie schnell zum Ende kommt, es sei denn, der Benutzer ist sich dessen bewusst, was sie tut.

Wenn der OnExit-Thread auf ein Problem stößt, wie z.B. einen Laufzeitfehler, wird das Skript terminiert. Dadurch wird verhindert, dass eine fehlerhafte Rückruffunktion oder Subroutine die Terminierung eines Skripts unmöglich macht.

Wenn der OnExit-Thread durch Exit oder ExitApp unter Angabe eines Exitcodes 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, er wird durch den Aufruf von ExitApp mit einem neuen Exitcode überschrieben.

Jedes Mal, wenn ein Exitversuch unternommen wird, verwendet jede Rückruffunktion oder die Subroutine vorerst die Standardwerte von Einstellungen wie SendMode. Diese Standardwerte können im automatischen Ausführungsbereich geändert werden.

Exitgründe

Grund Beschreibung
Logoff Der Benutzer meldet sich ab.
Shutdown Das System wird gerade heruntergefahren oder neu gestartet, z.B. durch den Shutdown-Befehl.
Close

Das Skript hat eine WM_CLOSE- oder WM_QUIT-Meldung empfangen, ist auf einen kritischen Fehler gestoßen oder wurde anderweitig geschlossen. All diese Fälle sind ungewöhnlich. WM_CLOSE könnte z.B. durch die Anwendung von WinClose auf das Hauptfenster des Skripts verursacht worden sein. Um das Fenster zu schließen (zu verstecken), ohne das Skript zu terminieren, verwenden Sie WinHide.

Wenn das Skript durch einen kritischen Fehler oder die Zerstörung des Hauptfensters beendet wird, wird es nach Abschluss des OnExit-Threads bedingungslos terminiert.

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

Error Es ist ein Laufzeitfehler in einem Skript aufgetreten, das weder Hotkeys hat noch persistent ist. Ein Laufzeitfehler tritt z.B. auf, wenn Run/RunWait das angegebene Programm oder Dokument nicht öffnen kann.
Menu Der Benutzer hat "Exit" im Menü des Hauptfensters oder im regulären Tray-Menü ausgewählt.
Exit Es wurde Exit oder ExitApp verwendet (einschließlich benutzerdefinierter Menüpunkte).
Reload Das Skript wird gerade via Reload-Befehl oder -Menüpunkt neu geladen.
Single Das Skript wird gerade aufgrund von #SingleInstance mit einer neuen Instanz von sich selbst ersetzt.

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

Beispiele

Funktion vs. Befehl.

Trotz unterschiedlicher Syntax haben beide Beispiele den gleichen Effekt: Sie fragen den Benutzer, bevor das Skript beendet wird. Um sie zu testen, rechtsklicken Sie auf das Tray-Symbol und wählen Sie Exit aus.

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

ExitFunk(ExitGrund, ExitCode)
{
    if ExitGrund not in Logoff,Shutdown  ; Leerzeichen neben dem Komma vermeiden.
    {
        MsgBox, 4, , Wollen Sie das Skript wirklich beenden?
        IfMsgBox, No
            return 1  ; Rückruffunktionen müssen ungleich 0 zurückgeben, um Exit zu verhindern.
    }
    ; ExitApp nicht verwenden - dies würde den Aufruf anderer Rückruffunktionen verhindern.
}
#Persistent  ; Verhindert, dass das Skript automatisch beendet wird.
OnExit, ExitSub
return

ExitSub:
if A_ExitReason not in Logoff,Shutdown  ; Leerzeichen neben dem Komma vermeiden.
{
    MsgBox, 4, , Wollen Sie das Skript wirklich beenden?
    IfMsgBox, No
        return
}
ExitApp  ; Ein Skript mit einer registrierten Subroutine wird nur terminiert, wenn die Subroutine ExitApp verwendet.

Registriert ein Objekt, das bei Exit aufgerufen werden soll.

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

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