Windowsフォームアプリケーションで、閉じるボタン(ウィンドウ右上の×ボタン)を押した際に終了確認用メッセージボックスを出力したい場合があると思います。しかし、別のアプリケーションからProcess
クラスのCloseMainWindow()
メソッドを実行してウィンドウを閉じる場合は終了確認用メッセージボックスを出力したくない場合もあるかと思います。その対処法を記述します。
動作確認環境
- Windows10
- C# 5.0
- .NET FrameWork 4.5
サンプル
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
var text = "閉じてよろしいでしょうか?";
var caption = "確認";
if (MessageBox.Show(text, caption, MessageBoxButtons.YesNo) == DialogResult.No)
{
var piCloseReason = this.GetType().GetProperty("CloseReason", BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.NonPublic);
piCloseReason.SetValue(this, CloseReason.None, null);
e.Cancel = true;
}
}
}
CloseMainWindow()
メソッドが実行されるとCloseReason
プロパティにCloseReason.TaskManagerClosing
がセットされます。
しかし、先に閉じるボタンを押して、表示されるメッセージボックスで「いいえ」ボタンを押してクローズ処理をキャンセルする等してCloseReason
プロパティにCloseReason.None
以外がセットされると、CloseMainWindow()
メソッドが実行されてもCloseReason
プロパティにCloseReason.TaskManagerClosing
がセットされません。
そこで、クローズ処理がキャンセルされた場合は、リフレクションを使用してCloseReason
プロパティにCloseReason.None
をセットしています。
これで期待通りの動作を実現できました。
参考
不備がございましたら、ご指摘いただければ幸いです。