OnExit

注册一个当脚本退出时, 会自动调用的函数.

OnExit Callback , AddRemove

参数

Callback

类型: 函数对象

要调用的函数.

回调函数接受两个参数, 可以定义如下:

MyCallback(ExitReason, ExitCode) { ...

虽然你给参数的名称并不重要, 但是下面的值会依次赋值给它们:

  1. 退出原因(下表中的一个单词).
  2. 传递给 ExitExitApp 的退出代码.

如果不需要相应的信息, 可以从回调函数的参数列表末尾省略一个或多个参数, 但在这种情况下必须指定星号作为最终的参数, 例如 MyCallback(Param1, *).

回调可以返回一个非零的整数来阻止脚本退出(除了一些罕见的例外), 也不会再调用其他回调. 否则, 脚本将在调用所有注册回调之后退出.

AddRemove

类型: 整数

如果省略, 则默认为 1(在所有之前注册的回调之后调用该回调). 否则, 请指定以下数字之一:

备注

可以注册任意数量的回调. 回调通常不应该调用 ExitApp, 如果调用了, 脚本将会立即退出.

当脚本以任何方式退出时, 将调用回调(除非被类似 "结束任务" 的方式强行终止). 每当 #SingleInstanceReload 请求前一个实例终止时, 也会调用它.

脚本可以通过 OnMessage(0x0011, On_WM_QUERYENDSESSION) 来检测和是否选择中止系统关闭或注销(有关工作脚本, 请参阅 OnMessage 的示例 #2).

OnExit 线程不遵守 #MaxThreads(它总是在需要的时候启动). 此外, 当它运行时, 它不会被任何线程中断, 包括热键, 自定义菜单项计时器子程序. 不过, 它会在这些情况下被中断(终止)(且脚本也同时被终止了), 用户从托盘菜单或主菜单栏中选择 Exit, 或由于 Reload#SingleInstance. 而要求脚本终止. 由于这些原因, 回调应该被设计为尽快结束, 除非用户知道正在做什么.

如果 OnExit 线程遇到失败条件, 比如运行错误时, 脚本将会终止.

如果 OnExit 线程是由 ExitExitApp 启动并指定了退出码, 则将使用该退出码, 除非回调返回 1(true) 阻止退出或调用 ExitApp.

每当进行一个退出尝试时, 每个回调都使用 SendMode 等设置的默认值重新启动. 这些默认值可以在脚本启动段中更改.

退出原因

原因 描述
Logoff 用户正在注销.
Shutdown 正在关闭或重启系统, 例如使用 Shutdown 函数.
Close

脚本发送 WM_CLOSE 或 WM_QUIT 消息, 出现致命错误, 或者正在被其他方式关闭. 尽管这些情况都是很少见的, 然而 WM_CLOSE 可能是由于在脚本主窗口使用 WinClose 而引起的. 要关闭(隐藏) 窗口而不终止脚本, 请使用 WinHide.

如果脚本因严重错误或其主窗口被被销毁而退出, 它将在 OnExit 线程完成后无条件终止.

如果主窗口正在被销毁, 它可能仍然存在, 但不能显示. 这个条件可以通过使用 OnMessage 监听 WM_DESTROY 消息来检测.

Error 在不是持续运行的脚本中发生了运行时错误. 运行时错误的一个例子是 Run/RunWait 无法启动指定的程序或打开指定的文档.
Menu 用户在主窗口的菜单或标准托盘菜单中选择了 Exit.
Exit 使用 ExitExitApp(包括自定义菜单项).
Reload 正通过 Reload 函数或菜单项重载脚本.
Single 由于 #SingleInstance 的原因, 脚本正被它自身的新实例代替.

OnError, OnMessage, CallbackCreate, OnClipboardChange, ExitApp, Shutdown, Persistent, 线程, Return

示例

在退出脚本之前询问用户. 要测试它们, 右击托盘图标 然后单击 Exit(退出).

Persistent  ; 阻止脚本自动退出.
OnExit ExitFunc

ExitFunc(ExitReason, ExitCode)
{
    if ExitReason != "Logoff" and ExitReason != "Shutdown"
    {
        Result := MsgBox("Are you sure you want to exit?",, 4)
        if Result = "No"
            return 1  ; 回调必须返回非零值来避免退出.
    }
    ; 不要调用 ExitApp -- 这会阻止其他回调的调用.
}

注册一个在退出时调用的方法.

Persistent  ; 阻止脚本自动退出.
OnExit MyObject.Exiting

class MyObject
{
    static Exiting(*)
    {
        MsgBox "MyObject is cleaning up prior to exiting..."
        /*
        this.SayGoodbye()
        this.CloseNetworkConnections()
        */
    }
}
unixetc