ユーザーがWinFormsプログラムを終了することを選択した後に何かをするというタスクを処理するより良い方法はありますか?
[編集 1 : 'NoBugz によるコメントへの応答]この場合、 Form には ControlBox がなく、ユーザーが Form を閉じることを選択したときに何が起こるかについて、1 レベルの間接化を設定する理由があります [/編集 1]
[編集 2: 1 月 20 日 GMT +7 18:35 の時点でのすべてのコメントへの応答]おそらく MainForm のフェードアウトを使用することは、アプリケーションが閉じられているときに何をしたいかの簡単な例です: ユーザーはそれと対話できません:アプリケーションを終了するというユーザーの決定に関連していることは自明です。[/編集 2]
(なんらかの形式のスレッドを使用しますか?) (マルチスレッド アプリへの影響は?) (このコードは「臭い」ですか?)
// 'shutDown is an external form-scoped boolean variable
//
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// make sure we don't block Windows ShutDown
// or other valid reasons to close the Form
if (e.CloseReason != CloseReason.ApplicationExitCall) return;
// test for 'shutDown flag set here
if (shutDown) return;
// cancel closing the Form this time through
e.Cancel = true;
// user choice : default = 'Cancel
if (MessageBox.Show("Exit Application ?", "", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == System.Windows.Forms.DialogResult.OK)
{
// user says Exit : activate Timer, set the flag to detect Exit
timer1.Enabled = true;
shutDown = true;
}
}
概要: 非常に標準的な WinForms アプリケーション (標準的な方法で Program.cs で起動された 1 つの MainForm): MainForm の FormClosing イベント ハンドラー:
すぐに終了します (デフォルトの動作をトリガーします: MainForm を閉じてアプリケーションを終了します) 次の場合:
を。CloseReason はその他の CloseReason.ApplicationExitCall です
b. 特別なブール変数が true に設定されている場合、または
すぐに終了しない場合: FormClosing への「最初の呼び出し」をキャンセルします。
次に、ユーザーは MessageBox.Show ダイアログを介して、アプリケーションを終了するか、キャンセルするかを選択します。
を。もちろん、ユーザーがキャンセルした場合、アプリケーションは「そのまま」残ります。
b. ユーザーが「終了」を選択した場合:
特別なブール値のフラグ変数を true に設定します
いくつかの特別なことをするタイマーを実行します。
Timer コードの内部テストで「特別な処理」が行われたことが検出されると、Application.Exit が呼び出されます。