システムシャットダウン時のウィンドウメッセージと、アプリケーション側の動作についてのメモ。

§1 システムシャットダウン時のメッセージ処理の流れ

  1. システムがシャットダウンをしようとする際、WM_QUERYENDSESSIONメッセージがトップレベルウィンドウに対して送られてくる。
  2. ここで、アプリケーションは終了できる状態であればTRUEを返す。 そうでなければFALSEを返す。
  3. WM_QUERYENDSESSIONメッセージに対してすべてのアプリケーションがTRUEを返した場合、システムはシャットダウンできる状態にあると見なしてシャットダウンを続行する。
  4. システムはすべてのトップレベルウィンドウに対してWM_ENDESSSIONメッセージを送信し、シャットダウンを開始することを知らせる。
  5. アプリケーションではこのメッセージを受信した時点で終了処理を行わなければならない。

§1.1 WM_QUERYENDSESSION

wParam
0: Windows終了のダイアログを使用したとき
0以外: タスクマネージャを使用したとき
lParam
0: システムがシャットダウンするとき
1: ユーザーがログオフするとき
戻り値
1(TRUE): 終了できるとき
0(FALSE): 終了できないとき

§1.2 WM_ENDSESSION

wParam
0: セッションが終了しないとき(WM_QUERYENDSESSIONでFALSEが返されたとき)
1: セッションが終了するとき
lParam
0: シャットダウンしようとしているとき
1: ログオフしようとしているとき
戻り値
常に0を返す

§2 .NET Frameworkでの動作

  1. マネージドコード(.NET Framework)では、Microsoft.Win32.SystemEventsクラスのSessionEndingイベント (WM_QUERYENDSESSION相当)とSessionEnded(WM_ENDSESSION相当)を利用する事ができる。
  2. Application.Run()したアプリケーションの実行途中でWM_ENDSESSIONが送信されてきた場合、Application.Run()から呼び出しが戻った時点でアプリケーションが停止する。
  3. WM_ENDSESSIONで終了させられる場合、Application.Run()以降のコードはすべて実行されなくなる。