본문 바로가기

Programming/MFC

WM_QUERYENDSESSION메세지로 운영체체 종료 알림


사용자 삽입 이미지


//

다음 예제는 운영체제 종료시 미저장 문서에 대해 사용자에게 질문하고 사용자의 응답에 따라 문서를 저장하거나 또는 버린다. 취소를 선택하면 운영체제 종료를 취소한다.

이 예제를 실행해 보면 시스템 종료시에는 WM_CLOSE, WM_DESTROY 등의 메시지가 전달되지 않음을 알 수 있다. 왜냐하면 운영체제 종료는 곧 전원이 꺼진다는 특수한 상황이기 때문에 메인 윈도우가 파괴되지 않기 때문이다. WM_CLOSE에서 미저장 문서에 대한 처리를 하고 있더라도 시스템 종료시에는 이 처리가 생략됨으로 별도의 처리가 있어야 한다.


#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("WM_QUERYENDSESSION2");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
   ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst=hInstance;
 
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=(WNDPROC)WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);
 hWndMain=hWnd;
 
 while(GetMessage(&Message,0,0,0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 int Result;
 TCHAR Mes[]="시스템 종료시에 미저장 문서를 저장하는 예제";

 switch(iMessage) {
 case WM_QUERYENDSESSION:
  if (TRUE/*미저장 문서가 있다 치고*/) {
   Result=MessageBox(hWnd,"이 문서를 저장할래?","질문",MB_YESNOCANCEL);
   if (Result==IDCANCEL) {
    return FALSE;
   }
   if (Result==IDYES) {
    // 저장했다 치고
   }
  }
  return TRUE;
 case WM_PAINT:
  hdc=BeginPaint(hWnd, &ps);
  TextOut(hdc,10,10,Mes,lstrlen(Mes));
  EndPaint(hWnd, &ps);
  return 0;
 case WM_CLOSE:
  MessageBox(hWnd,"나 지금 닫혀요","아이고",MB_OK);
  break;
 case WM_DESTROY:
  MessageBox(hWnd,"나 지금 죽어요","아이고",MB_OK);
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}