1 entries contain 'WM_ENDSESSION'

  1. 2007/03/23 WM_QUERYENDSESSION과 WM_ENDSESSION

프로그래밍 - Windows/Win32 API

WM_QUERYENDSESSION과 WM_ENDSESSION

운영체제가 종료되는 시점에 A란 작업을 처리해주고,
A작업이 종료되어야지만 운영체제가 종료하도록 수정을 하기 위해 문서들을 뒤적거렸다.
그러다가 메시지 WM_QUERYENDSESSION과 WM_ENDSESSION을 찾아냈다.

운영체재를 사용하는 사용자의 세션이 종료될 때 발생하는 이벤트로서, WM_QUERYENDSESSION으로 종료 여부를 묻고, 모든 프로세스에서 TRUE를 리턴했을 경우에만 (정확히는 일정 시간 내에 FALSE를 리턴하지 않았을 때만) WM_ENDSESSION을 발생시키게 된다.
그런데 내가 하고 싶었던 작업을 처리하기 위해서는 WM_QUERYENDSESSION가 발생하였을 때나 WM_ENDSESSION이 발생하였을 때 함수를 처리해야 하는데, 이 함수의 처리 시작이 짧지 않아서 모든 명령이 실행되기도 전에 윈도우가 끝나버린다.
따라서  WM_QUERYENDSESSION 에서  일단 FALSE를 리턴하여 종료를 막고, 내가 원하는 함수를 실행 시킨 뒤에 윈도우를 종료하던, 로그오프 시키던 재부팅하던 해야 한다.
WinAPI.co.kr에 나와있는 문서를 보면, (또한 테스트를 해 보면) 아래와 같은 인수로 인해 로그오프와 셧다운을 구별 할 수 있다.

Winapi.co.kr 에서 발췌

lParam : 로그오프를 하는 것인지 시스템 셧다운을 하는 것인지를 나타낸다. 이 값이 0이면 시스템을 완전히 종료하는 것이며 ENDSESSION_LOGOFF 플래그가 설정되어 있으면 로그오프만 하는 것이다. 이 값은 비트 필드이므로 반드시 & 연산자로 플래그의 존재 유무를 점검해야 한다.


자.. 문제는 지금부터. ENDSESSION_LOGOFF 가 설정되어있으면 이것은 사용자 로그오프를 선택한 작업이라는 것을 알 수 있다. 하지만 사용자가 Reboot을 결정한건지 off를 선택한것인지는 알아낼 방법이 없다...ㅡ.-;;
저걸 찾을려고 몇시간 동안 고생했는데 해답은 "윈도우 전원관리자 부분을 찾아보세요" OR "WMI에 그런 기능이 있는거 같아요" 라는 답뿐...

뭐 좋은 방법 없나?ㅡㅡ;

'프로그래밍 - Windows > Win32 API' 카테고리의 다른 글

WM_QUERYENDSESSION과 WM_ENDSESSION  (0) 2007/03/23
display 해상도 변경하기  (0) 2006/09/04
윈도우 메시지 WM_SYSCOMMAND  (0) 2006/09/01
Win32 Message 모음  (0) 2006/08/31
top