컴퓨터 종료, 다시시작, 로그오프를 할 때 WM_QUERYENDSESSION메세지가 발생된다.
그냥 인터넷보다가 호기심이 생겨서 좀더 찾아보니 역시!
Ezbeat님 블로그에서 재미난 자료를 찾았다.
위 세션종료 메세지가 발생하면 메세지박스를 띄운후에 컴퓨터 종료를 인위로 막는것이다.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString, int CmdShow )
{
WNDCLASS windowClass;
HWND hWnd;
MSG msg;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
windowClass.hCursor = LoadCursor (NULL, IDC_ARROW);
windowClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
windowClass.hInstance = hInstance;
windowClass.lpfnWndProc = (WNDPROC)WndProc;
windowClass.lpszClassName = "ClassName";
windowClass.lpszMenuName = NULL;
windowClass.style = CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass (&windowClass))
{
MessageBox(NULL, "Error : Cannot Register Window Class", "ERROR", MB_OK);
return (0);
} // end if
hWnd = CreateWindow ("ClassName",
"Taesun1114",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
(HMENU)NULL,
hInstance,
NULL);
ShowWindow ( hWnd , SW_HIDE);
while(GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){
switch(iMessage)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_QUERYENDSESSION:
MessageBoxA(hWnd,"Don't Windows End!!","MERONG~!!",MB_OK);
return FALSE;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
이때 중요한것이. WM_QUERYENDSESSION메세지를 받으면 FALSE를 리턴해줘야 종료가 되지 않는다. TRUE를 리턴하면 정상종료된다.