1

WM_QUERYENDSESSION docsによると、「アプリケーションはユーザーの意図を尊重し、TRUE を返す必要があります。」 このリンクは、「[in XP] アプリケーションは、閉じることができることを示すために TRUE を返すことができ、閉じる必要がないことを示すために FALSE を返すことができます」と要約しています。

ただし、自分のアプリでは、逆のことが起こっているようです。

  • FALSE を返すと、実行中のすべてのアプリが終了し、コンピューターが再起動します (また、アプリがWM_ENDSESSIONメッセージを受け取ると、 wParam「システムがシャットダウン中または再起動中である」ことを示す 1 に設定されます ( WM_ENDSESSION ドキュメントを参照))。

  • TRUE を返すと、実行中のアプリの一部が終了しますが、アプリに到達すると、シャットダウン プロセスが停止しているように見え、シャットダウンが中止されたかのように後続のWM_ENDSESSIONメッセージがwParam0 に設定され、アプリが開いたままです。DefWindowProcまた、 「[WM_QUERYENDSESSION] に対して TRUE を返す」ため、それを使用すると同様にシャットダウンもブロックされることに注意してください。

のすべての処理を完全に削除するとWM_QUERYENDSESSION、シャットダウン ビジネス全体が通常どおり行われ、アプリが終了してシャットダウンします。これは、アプリで何かひどく問題が発生していることを示している可能性がありますDefWindowProc。TRUE または FALSE を使用するか、メッセージとパラメーターを に渡すことによって、ハンドラーを return ステートメントのみに縮小した場合でも、この動作を観察しましたDefWindowProc

シャットダウンを停止したくないので、それが発生したときにログに記録できるように処理するだけだったので、すべての処理を削除して、必要に応じて動作させることができます。もちろん、これはドキュメントと完全に矛盾しているように見える理由を説明していないので、誰かアイデアがあるかどうか疑問に思っています.

これはすべて Windows XP でダウンするため、Vista 以降の変更は関係ありません。

4

1 に答える 1

3

これに関する重要な情報を少し忘れていたようです。ウィンドウにダイアログ テンプレートを使用していたため、ダイアログ ボックスのすべてのトラッピングで処理されていました。DialogProc ドキュメントに見られるように、「ダイアログ ボックス プロシージャが特定の戻り値を必要とするメッセージを処理する場合、ダイアログ ボックス プロシージャは、返す直前にSetWindowLong ( hwndDlgDWL_MSGRESULTlResultTRUE ) を呼び出して、目的の戻り値を設定する必要があります。」

私の問題の原因は、次のように説明できFALSEますFALSETRUE.

また、「ダイアログ ボックス プロシージャはウィンドウ プロシージャに似ていますが、DefWindowProc不要なメッセージを処理する関数を呼び出してはなりません。不要なメッセージは、ダイアログ ボックス ウィンドウ プロシージャによって内部的に処理されます」という点にも注意してください。だから私はそれについてほとんどすべて間違っていました。

于 2012-06-04T16:12:27.947 に答える