2014-11-12 2 views
0

예를 들어 주 창을 닫으면 트레이에 숨겨지는 Win32 응용 프로그램이 있습니다.
사용자가 재부팅하거나 종료 할 때 OS 응용 프로그램이 어떤 식 으로든 닫혔습니다.
이 닫기 이벤트를 올바르게 처리하는 방법은 무엇입니까?
Windows 재부팅/종료와의 상호 작용

+0

당신이 종료를 처리 하시겠습니까, 또는 시스템 트레이 아이콘으로 응용 프로그램 숨기기를 하시겠습니까? – Ajay

답변

2

이 내용은 MSDN의 Shutting Down에 설명되어 있습니다.

기본적으로 WM_QUERYENDSESSION 또는 WM_ENDSESSION 또는 둘 다를 수신하는 최상위 창이 필요합니다. 이러한 메시지가 도착하면 종료 관련 작업을 수행 할 수 있습니다.

창과 메시지 큐가있는 응용 프로그램은 WM_QUERYENDSESSION 및 WM_ENDSESSION 메시지를 통해 시스템 종료 알림을 수신합니다. 이러한 응용 프로그램은 종료 될 수 있음을 나타 내기 위해 TRUE를 반환해야합니다. 절대적으로 필요한 경우가 아니면 응용 프로그램이 시스템 종료를 막지 않아야합니다. 응용 프로그램은 WM_ENDSESSION을 처리하는 동안 필요한 정리 작업을 수행해야합니다. 저장되지 않은 데이터가있는 응용 프로그램은 데이터를 임시 위치에 저장하고 다음에 응용 프로그램이 시작될 때 데이터를 복원 할 수 있습니다. 응용 프로그램은 데이터 및 상태를 자주 저장하는 것이 좋습니다. 예를 들어, 사용자가 시작한 저장 조작 사이에 자동으로 데이터를 저장하여 시스템 종료시 저장되는 데이터의 양을 줄입니다.

중단 중에 생존 할 수없는 중요한 작업을 수행 중이므로 종료 중 UI를 표시하려면 ShutdownBlockReasonCreate을 사용할 수 있습니다.

응용 프로그램에서 잠재적 인 시스템 종료를 차단해야하는 경우 ShutdownBlockReasonCreate 함수를 호출 할 수 있습니다. 호출자는 사용자에게 표시 될 이유 문자열을 제공합니다. 이유 문자열은 짧고 명확해야하며 사용자에게 시스템 종료를 계속할지 여부를 결정하는 데 필요한 정보를 제공해야합니다.

이 프로세스는 Vista에서 크게 변경되었습니다. XP를 지원해야하는 경우 XP에서 다르게 작동하는 코드가 필요할 수 있습니다. 해당 항목은 MSDN : Application Shutdown Changes in Windows Vista에서도 다룹니다.

+0

트레이에 숨어있는 응용 프로그램이 중요한 작업을 수행하지 않아야합니다. 종료 할 때 갑자기 UI를 표시 할 이유는 없습니다. – MSalters

+0

@MSalters 아마도 CD 굽기 응용 프로그램이 알림 영역을 합리적으로 숨길 수 있습니다. 나는 asker의 앱이 무엇을하고 있는지 모른다. –

+0

IIRC 같은 앱은 완전히 사라지지 않고 최소화하기로되어 있습니다. 알림 영역은 재미있는 일이 발생할 때까지 그냥 공회전하는 작은 프로세스를위한 것입니다. – MSalters

-2

퇴각하면 프로그램에 SIGTERM 또는 SIGINT가 전송됩니다. 이것을 통해 처리 할 수 ​​있습니다. 참조 : http://www.cplusplus.com/reference/csignal/signal/

void my_handler (int param) 
{ 
    // clean up here 
} 
int main() 
{ 
    signal(SIGINT my_handler); // try also SIGTERM 
} 
+1

POSIX가 아니라 Windows입니다. – MSalters

+0

당신 말이 맞아요. "SIGILL 및 SIGTERM 신호가 Windows에서 생성되지 않았습니다." MSDN에서 ... – m0e

+0

특히, MSDN을 인용하자면 : "SIGINT는 모든 Win32 응용 프로그램에서 지원되지 않습니다 ... SIGILL 및 SIGTERM 신호는 Windows에서 생성되지 않습니다." – MSalters