OnExit

스크립트가 종료할 때 자동으로 실행할 서브루틴 또는 함수를 지정합니다.

OnExit [, Label]
OnExit(Func [, AddRemove])  ; Requires [v1.1.20+]
선택

매개변수

Label

생략하면, 이전에 등록된 라벨이 등록 해제됩니다. 그렇지 않으면 스크립트가 어떤 방식으로든 종료할 때 그의 내용이 (새 쓰레드로) 실행될 라벨의 이름을 지정하십시오.

Func

스크립트가 종료할 때 호출할 함수 이름 또는 함수 객체. 이 함수는 선택적으로 아래와 같이 매개변수를 정의할 수 있습니다. OnExit 함수가 0 아닌 정수 값을 돌려 주면, 스크립트는 종료하지 않습니다. 그렇지 않으면, 스크립트는 모든 등록된 함수를 호출한 후에 종료합니다.

ExitFunc(ExitReason, ExitCode)
AddRemove

다음 값 중 하나:
1 (기본값): 이전에 등록된 함수들 다음에 이 함수를 호출합니다.
-1: 이전에 등록된 함수보다 먼저 이 함수를 호출합니다.
0: 함수를 호출하지 않습니다.

라벨(서브루틴)이 등록되어 있으면, 그것이 언제나 먼저 호출됩니다.

논평

중요: 스크립트를 종료하는 대신에 지정된 서브루틴이 호출되기 때문에, 그 서브루틴은 종료가 필요하면 반드시 ExitApp 명령어를 사용해야 합니다. [v1.1.20+]: 새 스크립트는 서브루틴 대신에 함수를 사용해야 합니다 -- 이렇게 하면 우발적으로 종료가 불가능한 스크립트를 만들어 낼 위험을 줄여 줍니다. 그리고 Exit 또는 ExitApp에 건넨 종료 코드가 보존된다는 확신을 할 수 있습니다.

[v1.1.20+]: 얼마든지 OnExit 함수를 등록할 수 있습니다. 라벨 (서브루틴)도 등록되어 있다면, 함수는 서브루틴이 ExitApp를 호출한 뒤에 호출됩니다. OnExit 함수는 보통 ExitApp를 호출하면 안 됩니다; 그럴 경우, 스크립트는 즉시 종료합니다.

어떤 수단으로든 스크립트가 종료할 때 OnExit 서브루틴이 호출됩니다 (단, "End Task"와 같은 것으로 종료되는 경우는 예외입니다). 또한 #SingleInstance 그리고 Reload 명령어가 이전이 실체를 종료하도록 요구할 때마다 호출됩니다.

스크립트는 OnMessage(0x11, "WM_QUERYENDSESSION")를 통하여 시스템 셧다운이나 로그오프를 탐지할 수 있고 선택적으로 취소할 수도 있습니다.

OnExit 쓰레드#MaxThreads를 준수하지 않습니다. (필요하면 언제든지 기동합니다). 게다가, 실행 중인 동안, 다른 쓰레드로 인터럽트 할 수 없습니다. 여기에는 핫키, 맞춤 메뉴 항목, 그리고 타이머 서브루틴이 포함됩니다. 그렇지만, 사용자가 메인 메뉴나 트레이 메뉴로부터 Exit을 선택했다면 인터럽트 됩니다 (그리고 스크립트는 종료합니다). 그렇지 않으면 스크립트에 Reload 또는 #SingleInstance 결과로 종료하도록 요구합니다. 이 때문에 OnExit 서브루틴은 빨리 끝나도록 설계해야 합니다. 단, 사용자가 무슨 일이 진행되는지 알고 있는 경우는 예외입니다.

OnExit 쓰레드가 실행시간 에러 같은 실패 조건을 만나면, 스크립트는 종료합니다. 이 때문에 결함이 있는 OnExit 서브루틴은 스크립트를 종료하지 못하게 막을 수 없습니다.

Exit 또는 ExitApp 명령어 때문에, 종료 코드를 지정한 OnExit 서브루틴이 기동되면, v1.1.19 이전에서 그 코드는 무시되고 더 이상 사용할 수 없습니다. [v1.1.20+]에서 최초의 종료 코드가 사용됩니다. 단, ExitApp 호출하여 새 종료 코드로 오버라이드한 경우는 예외입니다.

OnExit 서브루틴이 종료 시도로 호출될 때마다, SendMode와 같은 설정에 대한 기본 값들을 가지고 새롭게 시작합니다. 이런 기본값들은 자동-실행 섹션에서 바꿀 수 있습니다.

내장 함수 A_ExitReason는 비어 있습니다. 단, OnExit 서브루틴이 현재 실행 중이거나 이전이 종료 시도로 인해 적어도 한 번 호출된 경우는 예외입니다. 비어 있지 않으면, 다음 단어 중 하나입니다:

Logoff 사용자가 로그오프 중입니다.
Shutdown 예를 들어 Shutdown 명령어로 시스템이 닫히고 있는 중이거나 재시작 중입니다.
Close 스크립트에 WM_CLOSE 또는 WM_QUIT 메시지가 전송되었습니다. 스크립트에 심각한 에러가 있습니다. 또는 다른 어떤 방법으로 닫혔습니다. 이 모든 것이 비정상적이지만, WM_CLOSE는 스크립트의 메인 창에 사용된 WinClose에 의해 야기될 수도 있습니다. 이를 방지하려면, 메인 창을 Send, !{F4}로 취소하십시오.
Error 실행시간 에러가 핫키가 없고 영속적이 아닌 스크립트에 일어났습니다. 실행시간 에러의 예는 Run/RunWait가 지정된 프로그램이나 문서를 기동시키지 못하는 경우입니다.
Menu 사용자가 메인 창의 메뉴 또는 표준 트레이 메뉴로부터 로부터 Exit를 선택했습니다.
Exit Exit 또는 ExitApp 명령어가 사용되었습니다 (맞춤 메뉴 항목 포함).
Reload 스크립트가Reload 명령어나 메뉴 항목을 통하여 재적재 중입니다.
Single #SingleInstance의 결과로 스크립트가 자신의 새 실체로 교체 중입니다.

관련 항목

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

예제

다음 예제는 #Persistent를 사용하여 스크립트가 자동으로 종료하는 것을 막습니다. 스크립트를 실행한 후에, 트레이 아이콘을 우클릭하고 Exit을 클릭해 보면 OnExit 또는 함수가 작동하는지 검증해 볼 수 있습니다. 그 다음 "Yes"를 클릭하면 스크립트가 종료하고 "No"를 클릭하면 실행을 그대로 유지합니다.

#Persistent
OnExit, ExitSub
return

ExitSub:
if A_ExitReason not in Logoff,Shutdown  ; 이 줄에서 쉼표 둘레에 스페이스를 피하십시오.
{
    MsgBox, 4, , 종료하고 싶습니까?
    IfMsgBox, No
        return
}
ExitApp  ; OnExit 서브루틴이 있는 스크립트는 종료하지 않습니다. 단, 서브루틴이 ExitApp를 사용하는 경우는 예외입니다.
선택 | 내려받기
 
#Persistent

; 종료시에 호출될 함수를 등록합니다:
OnExit("ExitFunc")

; 종료시에 호출돌 객체를 등록합니다:
OnExit(ObjBindMethod(MyObject, "Exiting"))

ExitFunc(ExitReason, ExitCode)
{
    if ExitReason not in Logoff,Shutdown
    {
        MsgBox, 4, , 끝내고 싶습니까?
        IfMsgBox, No
            return 1  ; OnExit 함수는 종료를 막기 위해 반드시 0 아닌 값을 돌려주어야 합니다.
    }
    ; ExitApp를 호출하지 마십시오 -- 그러면 다른 OnExit 함수가 호출되지 못합니다.
}

class MyObject
{
    Exiting()
    {
        MsgBox, 종료하기 전에 MyObject가 청소 중입니다...
        /*
        this.SayGoodbye()
        this.CloseNetworkConnections()
        */
    }
}
선택 | 내려받기