WM_QUERYENDSESSION docsによると、「アプリケーションはユーザーの意図を尊重し、TRUE を返す必要があります。」 このリンクは、「[in XP] アプリケーションは、閉じることができることを示すために TRUE を返すことができ、閉じる必要がないことを示すために FALSE を返すことができます」と要約しています。
ただし、自分のアプリでは、逆のことが起こっているようです。
FALSE を返すと、実行中のすべてのアプリが終了し、コンピューターが再起動します (また、アプリが
WM_ENDSESSION
メッセージを受け取ると、wParam
「システムがシャットダウン中または再起動中である」ことを示す 1 に設定されます ( WM_ENDSESSION ドキュメントを参照))。TRUE を返すと、実行中のアプリの一部が終了しますが、アプリに到達すると、シャットダウン プロセスが停止しているように見え、シャットダウンが中止されたかのように後続の
WM_ENDSESSION
メッセージがwParam
0 に設定され、アプリが開いたままです。DefWindowProc
また、 「[WM_QUERYENDSESSION] に対して TRUE を返す」ため、それを使用すると同様にシャットダウンもブロックされることに注意してください。
のすべての処理を完全に削除するとWM_QUERYENDSESSION
、シャットダウン ビジネス全体が通常どおり行われ、アプリが終了してシャットダウンします。これは、アプリで何かひどく問題が発生していることを示している可能性がありますDefWindowProc
。TRUE または FALSE を使用するか、メッセージとパラメーターを に渡すことによって、ハンドラーを return ステートメントのみに縮小した場合でも、この動作を観察しましたDefWindowProc
。
シャットダウンを停止したくないので、それが発生したときにログに記録できるように処理するだけだったので、すべての処理を削除して、必要に応じて動作させることができます。もちろん、これはドキュメントと完全に矛盾しているように見える理由を説明していないので、誰かアイデアがあるかどうか疑問に思っています.
これはすべて Windows XP でダウンするため、Vista 以降の変更は関係ありません。