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() */ } }