OnExit

From AutoHotkey

OnExit

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

OnExit [, Label]

参数

标签

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

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

备注

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

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

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

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

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

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

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

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