質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

3回答

4470閲覧

windowsフォームアプリの強制シャットダウン時の処理について

taaaaaa6

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2020/09/25 06:54

前提・実現したいこと

お世話になります。
C# windowsフォームアプリケーションで開発をしております。
アプリの×ボタンやフォームの終了時にForm1_FormClosingでconfigファイルに画面の情報を保存する方法が分かりました。
そこでPCの電源を強制的に切った時にも保存されるのか試してみたところ、どうも保存されていないみたいでした。

・Form1_FormClosingで電源を強制的に落とされた場合でも保存ができるのか
・Form1_FormClosingで保存できないのなら他に保存方法があるのか

上記2点か、そもそも保存できないのか知りたいです。
よろしくお願いいたします。

該当のソースコード

C#

1private void Form1_FormClosing(object sender, FormClosingEventArgs e) 2 { 3 Properties.Settings.Default.label1Text = this.label1.Text; 4 }

補足情報(FW/ツールのバージョンなど)

Visual Studio Community 2019 16.7.3
.NET Framework 4.8.03752

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/25 07:18

> そもそも保存できないのか知りたいです。 100% 絶対できないとまで言い切る自信はないですが、できないと思って、UPS を導入するとかした方が良いと思います。
taaaaaa6

2020/09/25 07:25

>UPS を導入するとかした方が良いと思います やっぱりそうですよね。。。 ありがとうございました!
dodox86

2020/09/25 07:29

> そこでPCの電源を強制的に切った時 電源ケーブルを抜くなり、電源ボタンをいきなりオフにするなり、電力供給を突然、切る訳ですよね。それはシャットダウンではないので"強制シャットダウン"とは言いません。 強制シャットダウンと言うのであれば、「シャットダウンを抑止しているアプリを無視してシャットダウン処理を続行する。」ような意味です。(それはまぁ、あります) 電源ブチ切りであれば、Windows上のあらゆるイベントは発生するまでも無く電源OFFになるので、何らかの終了のイベントすら発生しません。
taaaaaa6

2020/09/25 07:33

>電源ケーブルを抜くなり、電源ボタンをいきなりオフにするなり、電力供給を突然、切る訳ですよね。それはシャットダウンではないので"強制シャットダウン"とは言いません。 そうなんですね、勉強になりました。 他の方も言われている通り電源供給が止まったらイベントが起きないんですね。 ご教示ありがとうございました!
guest

回答3

0

こういうものがあります。

SystemEvents.SessionEnding イベント

ユーザーがシステムからログオフしようとした場合、またはシステムをシャットダウンしようとした場合に発生します。

あとはWndProcオーバーライドして、WM_QUERYENDSESSIONやWM_ENDSESSIONをチェックするとかでもいけるかもしれません。(試してはないです)

と書いてから気付いたのですが、実現したい事を読むと電源切断による強制終了なのでシャットダウンとは別物ですね。その場合は検出しようがないので、無理です。

投稿2020/09/25 07:34

編集2020/09/25 07:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taaaaaa6

2020/09/25 07:39

>と書いてから気付いたのですが、質問のケースはシャットダウンではなく電源切断の強制終了ですね。 その場合は検出しようがないので、無理です。 電源切断のことを強制シャットダウンだと勘違いしておりました。。。 申し訳ございません。。。 回答ありがとうございます!
guest

0

類似の質問があるようです。
プロセスを強制終了されたとき発生するイベントについて

  • リストForm1_FormClosingで電源を強制的に落とされた場合でも保存ができるのか

⇒ そのような方法はありません。コンセントを引っこ抜かれたときを想定しますが、電源供給がなくなる=急に意識を失うようなものなので、当然なにも対処はできません。

  • リストForm1_FormClosingで保存できないのなら他に保存方法があるのか

私なら以下方法で近いことを実現します。
0. アプリケーション起動中に定期的に保存処理を行う。極端に言えば1秒おきに保存すれば、いつプロセスが死んでもデータは残りますよね。
もちろん、保存処理中に死んだら破損データになる可能性もあるので、そうならないよう工夫する必要があります(1秒おきにconfig.tmpに保存して、保存完了したら元のconfigに上書きリネームするとか)
0. UPSを繋げてPCの電源が急に落ちないようにします。いいUPSだと電源低下を検出して特定のアプリを安全に落とす方法が提供されていたりするので、その機構を使用してアプリケーションを通常の方法で終了させます。
ただし、UPSからPCのコンセントが引っこ抜かれるケースは想定しないものとします。

投稿2020/09/25 07:29

ry188472

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taaaaaa6

2020/09/25 07:38

>極端に言えば1秒おきに保存すれば、いつプロセスが死んでもデータは残りますよね 定期的に保存する方法もあるのですね。勉強になります。 今回のアプリの画面は絶対に保存しなければならないものではないのでUPSは買わない方向でした。すみません。。。 回答ありがとうございました!
ry188472

2020/09/25 07:43

> 今回のアプリの画面は絶対に保存しなければならないものではないのでUPSは買わない方向でした。すみません そういうことであれば、プログラムは変更せずに「プロセスが誰かに強制終了された」「誰かが強制的にログオフ/シャットダウンしてアプリが落ちた」「停電した」「電源ケーブルが急に断線した」みたいな特殊なケースは想定外です、くらいで納得してもらうのも手かもしれません。
guest

0

ベストアンサー

https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/advanced/how-to-write-user-settings-at-run-time-with-csharp?view=netframeworkdesktop-4.8

Properties.Settings.Default.Save();

することで、任意のタイミングで保存できると思います。

PCの電源を強制断したときのことまで考えるのであれば(ソフトウェアではどうにもなりませんので)、
設定の保存タイミングをForm_Closingから、設定入力欄の変更時に設定を保存してしまうなども検討した方がよいかもしれません。

投稿2020/09/25 07:18

編集2020/09/25 07:24
YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taaaaaa6

2020/09/25 07:23

あ、すみません。 Properties.Settings.Default.Save();を記述し忘れていました。。。 申し訳ないです。 Properties.Settings.Default.Save();でconfigファイルに保存ができますよね!
YakumoSaki

2020/09/25 07:25

すいません、こちらも質問文をちゃんと読めてなくて中途半端な記述になっていました。 あまり有用なことは書いてませんがちょっと追記しました。
taaaaaa6

2020/09/25 07:28

なるほど、重くならなさそうならそれを検討してみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問