トップ回答者
シャットダウン・ログオフ時のプログラム終了処理について

質問
-
お世話になっております。
OSのシャットダウン、ログオフ時の動作について質問があり投稿させていただきました。
C#でWindowsフォームアプリを開発しております。
Windowsフォームアプリ終了時にいくつか処理を実行しています。①終了確認ダイアログを表示
②処理1
③処理2
④処理3
※処理1・2・3はリソースの開放、ログ出力などの後処理です
※①のダイアログで「はい」を選択すると②の処理が走りますこのWindowsフォームアプリを起動したままWindowsをシャットダウンまたはログオフすると
①のダイアログが表示され「はい」を押下するとプログラムは終了するのですが、
処理が②や③など途中で終了してしまいます。Windowsをシャットダウンまたはログオフすると起動中のアプリケーションに終了命令が出されるところまでは理解しているのですが、
終了命令後、各アプリケーションが完全に終わるのを待たず、シャットダウンやログオフがされてしまうのでしょうか。
てっきりアプリケーションが最後まで終了するのを待つのだと思っておりましたが、この認識が間違いでしたらご指摘ください。また、アプリケーションの終了を待っていないとしたらOSはどのようにアプリを終了させているのでしょうか。(プロセスの強制終了?)
情報をお持ちの方がいらっしゃいましたらご教授いただければと思います。
- 編集済み r_naka 2015年9月3日 5:51
回答
すべての返信
-
-
Win32SDK上の一般論で言うと、アプリケーションが終了前にやるべきことがある場合、
トップレベルウインドウのコールバックがWM_ENDSESSIONに応答する前に完了すべきです。
(最初のコメントではWM_QUERYENDSESSIONとしていましたが、誤りです)
このあたりが参考になるかもしれません。◇間違いました。
お馬鹿さんの指摘の通りWM_ENDSESSIONですね。- 編集済み 仲澤@失業者 2015年9月3日 7:56
-
F.Y.I.
--------------------------------------------------
Shutdown Changes for Windows Vista
https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb394721(v=vs.85).aspxBest Practices
- Applications should not block shutdown.
Respond to WM_QUERYENDSESSION as quickly as possible
and postpone cleanup activities until processing
the WM_ENDSESSION message.- Applications that must block shutdown should use the new
ShutdownBlockReasonCreate function to register a string
that explains the reason to the user.
The user can decide whether to continue or cancel shutdown.- Applications cannot rely on being able to block shutdown.
-------------------------------------------------- -
PCがシャットダウンしようとしている、という文脈では、「Mainの最後にいくまで待ってくれる」というのは間違いです。
要は、「ノートパソコンとかをシャットダウンして、ふたを閉めて、電源を抜いて移動した。フタを開けてみると『本当に終了しますか』とかのダイアログボックスに阻止されてバッテリーがほとんどなくなっていた」という事態をどう防ぐか、みたいな話です。
「CDを焼いているとかのどうしてもシャットダウンをしてほしくない」ような特別な状況以外では、シャットダウンを阻止するな、というのがMicrosoftの主張であり選択ですね。そしてその特別な場合でも「CDなんかどうでもいいからシャットダウンさせてくれ」という、ユーザーの意志次第では、電源を切ることはできます。参考までに下記リンクをどうぞ。
http://blogs.msdn.com/b/oldnewthing/archive/2005/08/22/454487.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2007/04/16/2148139.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2012/06/14/10319617.aspxjzkey