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

  • 質問

  • お世話になっております。

    OSのシャットダウン、ログオフ時の動作について質問があり投稿させていただきました。

    C#でWindowsフォームアプリを開発しております。
    Windowsフォームアプリ終了時にいくつか処理を実行しています。

    ①終了確認ダイアログを表示
    ②処理1
    ③処理2
    ④処理3
    ※処理1・2・3はリソースの開放、ログ出力などの後処理です
    ※①のダイアログで「はい」を選択すると②の処理が走ります

    このWindowsフォームアプリを起動したままWindowsをシャットダウンまたはログオフすると
    ①のダイアログが表示され「はい」を押下するとプログラムは終了するのですが、
    処理が②や③など途中で終了してしまいます。

    Windowsをシャットダウンまたはログオフすると起動中のアプリケーションに終了命令が出されるところまでは理解しているのですが、
    終了命令後、各アプリケーションが完全に終わるのを待たず、シャットダウンやログオフがされてしまうのでしょうか。
    てっきりアプリケーションが最後まで終了するのを待つのだと思っておりましたが、この認識が間違いでしたらご指摘ください。

    また、アプリケーションの終了を待っていないとしたらOSはどのようにアプリを終了させているのでしょうか。(プロセスの強制終了?)

    情報をお持ちの方がいらっしゃいましたらご教授いただければと思います。



    • 編集済み r_naka 2015年9月3日 5:51
    2015年9月3日 5:50

回答

すべての返信

  • フォーラム オペレーターの星 睦美です。r_naka さん、投稿ありがとうございます。

    OSの機能に関してはもしかしたらTechNet のOSに関するフォーラムのほうが適切なのかもしれませんが、対象としているOS の種類と具体的なコードを質問に加えていただくと参考になる情報が見つかりやすいように思います。

    フォーラム ユーザーからの回答が参考になりましたら[回答としてマーク] をお願いいたします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support


    • 編集済み 星 睦美 2015年9月4日 4:59 追加
    2015年9月3日 5:59
  • https://social.technet.microsoft.com/Forums/windows/ja-JP/f59527af-0654-427c-b3a4-97b7f7d70de2/windows-8-?forum=w8itpro これかな

    Jitta@わんくま同盟

    • 回答としてマーク r_naka 2015年9月11日 4:25
    2015年9月3日 6:31
  • Win32SDK上の一般論で言うと、アプリケーションが終了前にやるべきことがある場合、
    トップレベルウインドウのコールバックがWM_ENDSESSIONに応答する前に完了すべきです。
     (最初のコメントではWM_QUERYENDSESSIONとしていましたが、誤りです)
    このあたりが参考になるかもしれません。

    https://msdn.microsoft.com/ja-jp/library/microsoft.win32.systemevents.sessionending%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    ◇間違いました。
     お馬鹿さんの指摘の通りWM_ENDSESSIONですね。

    2015年9月3日 6:32
  • F.Y.I.
    --------------------------------------------------
    Shutdown Changes for Windows Vista
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb394721(v=vs.85).aspx

    Best 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.
    --------------------------------------------------

    2015年9月3日 7:37
  • 返信が遅れてしまい申し訳ありません。

    星様

    ご回答ありがとうございます。
    具体的なコードは量が多すぎる故乗せることができなかったため、処理の概要のみを記載いたしました。
    次回OSに関する質問は「TechNet のOSに関するフォーラム」に投稿させていただきます。


    • 編集済み r_naka 2015年9月8日 6:18
    2015年9月8日 6:14
  • Jitta様

    返信が遅れてしまい申し訳ありません。
    ご回答ありがとうございます。

    ご教示いただいたURLを拝見いたしました。
    内容としては似ておりますが、「終了命令後、各アプリケーションが完全に終わるのを待たず、シャットダウンやログオフがされてしまうのか」というところが知りたかったので少し異なっておりました。
    ただ、こちらに掲載されている情報もとても参考になりました。
    ありがとうございます。

    2015年9月8日 6:18
  • お馬鹿様

    返信が遅れてしまい申し訳ありません。
    ご回答ありがとうございます。

    仲澤様の回答と合わせ大変参考になりました。
    ありがとうございます。

    2015年9月8日 6:34
  • 仲澤様

    返信が遅れてしまい申し訳ありません。
    ご回答ありがとうございます。

    ご教示いただいたWM_ENDSESSIONイベントをキャッチして処理するよう対応してみます。

    やはり、このイベントをキャッチしないと途中で処理は中断してしまっても仕方ないのでしょうか…
    最初で記載したようにてっきりOSはプログラムが最後まで(つまりMainメソッドの最後に行くまで)待ってくれるものだと思っていたのですが、
    これはとんでもない認識ちがいなのでしょうか。
    もしご存知でしたらご教示いただけると幸いです。

    2015年9月8日 6:49
  • 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.aspx


    jzkey

    2015年9月8日 7:50
  • HomeClosetさんの投稿にあるURLですよ

    Jitta@わんくま同盟

    • 回答としてマーク r_naka 2015年9月11日 4:25
    2015年9月8日 7:53
  • jzkey様

    返信が遅れてしまい申し訳ありません。
    ご回答ありがとうございます。

    わかりやすい具体例を交えての回答ありがとうございます。
    >「CDを焼いているとかのどうしてもシャットダウンをしてほしくない」ような特別な状況以外では、シャットダウンを阻止するな、というのがMicrosoftの主張であり選択ですね
    納得いたしました。だから途中で処理が中断していたのだと理解しました。
    仲澤様に教えていただいた方法で対応策を練るしかないようですね。
    大変勉強になりました。

    2015年9月11日 4:23
  • Jitta様

    返信が遅れてしまい申し訳ありません。
    ご回答ありがとうございます。

    貼っていただいたリンク先のみ確認していたため、投稿のURLまで確認しておりませんでした。
    確認したところ、どんぴしゃで今回知りたい内容でした。
    Vistaから仕様が変わってしまったということで、納得いたしました。

    いつも助けていただきありがとうございます。

    2015年9月11日 4:25
  • このたびは大変お世話になりました。

    Jittaの回答を「回答としてマーク」させていただきました。
    ただ、対応策やその他具体的な例を挙げての解説など、大変勉強になりました。
    改めてお礼申し上げます。

    今後ともよろしくお願いいたします。

    2015年9月11日 4:28