OnExit

指定在脚本退出时自动运行的子程序

OnExit [, Label]

参数

标签

如果省略, 则脚本会返回到正常的退出行为. 否则, 请指定 标签 的名称, 当脚本由于任意原因退出时将执行标签中的内容 (作为新 线程).

重要提示: 由于调用这个指定的子程序而没有终止脚本, 所以想要终止脚本时必须在这个子程序中使用 ExitApp 命令. 可选的 (如同下面的示例部分那样), OnExit 子程序可以显示一个 MsgBox 来提示用户确认, 只有当用户按下 YES 时才会执行 ExitApp 退出脚本.

备注

当脚本由于任意原因退出时会调用 OnExit 子程序 (除非脚本是被像结束任务这样杀掉). 每当 #SingleInstanceReload 命令要求终止前一个实例时, 也会调用这个子程序.

脚本可以通过 OnMessage(0x11, "WM_QUERYENDSESSION") 检测并且可以终止系统关闭或注销操作。

OnExit 线程 不遵循 #MaxThreads (需要时它总是会运行). 此外, 当它运行的时候, 它不会被任何 线程 中断, 包括 热键, 自定义菜单项 以及 定时子程序. 然而, 如果用户在托盘菜单或主菜单中选择 Exit, 或者通过 Reload#SingleInstance 命令要求终止脚本时, 它将会终止执行 (同时脚本将退出). 因此, OnExit 子程序应该设计成快速结束, 除非用户明白自己正在做什么.

如果 OnExit 线程 遇到诸如运行时错误的失败状况, 则脚本会终止. 这样避免了有问题的 OnExit 子程序使得脚本无法终止的情况出现.

如果 OnExit 子程序是由指定退出码的 ExitExitApp 命令运行的, 则会忽略退出码. OnExit 子程序中可以使用 ExitApp 指定新的退出码.

每当脚本退出尝试调用 OnExit 子程序时, 这时会使用设置 (例如 SendMode) 的默认值开始. 这些默认值可以在 自动执行段 改变.

内置变量 A_ExitReason 为空,除非 OnExit 子程序正在运行或者在之前的退出中至少调用过一次。如果不是空的, 则它为下列单词的其中一个:

logoff 用户正在注销.
Shutdown 正在关闭或重启系统, 例如使用 Shutdown 命令.
Close 脚本接收到 WM_CLOSE 或 WM_QUIT 消息, 出现致命错误或者正被以其他方式关闭. 尽管这些情况都是很少见的, 然而 WM_CLOSE 可能是由脚本主窗口使用 WinClose 命令发出的. 要避免这种情况,请使用 Send, !{F4} 关闭主窗口。
错误 在没有热键且不是 持续运行的 脚本中发生了运行时错误. 运行时错误的一个例子是 Run/RunWait 命令无法启动指定的程序或打开指定的文档.
Menu 用户在主窗口的菜单或标准托盘菜单中选择了退出.
Exit 使用了 ExitExitApp 命令 (包括 自定义菜单项).
Reload 正通过 Reload 命令或菜单项重载脚本.
Single 由于 #SingleInstance 的结果, 脚本正被它自身的新实例代替.

相关

OnMessage(), RegisterCallback(), OnClipboardChange, ExitApp, Shutdown, #Persistent, 线程, Gosub, Return, Menu

示例

#Persistent  ; 为了进行演示, 当用户选择 "No" 时让脚本持续运行.
OnExit, ExitSub
return

ExitSub:
if A_ExitReason not in Logoff,Shutdown  ; 在这行语句中, 注意不要在逗号周围含有空格.
{
    MsgBox, 4, , Are you sure you want to exit?
    IfMsgBox, No
        return
}
ExitApp  ; 含 OnExit 脚本终止自身的唯一方法是在 OnExit 子程序中使用 ExitApp.