LoginSignup
0
2

More than 5 years have passed since last update.

別アプリケーションからProcessクラスのCloseMainWindow()メソッドを使用してウィンドウを閉じる際に、終了確認用メッセージボックスを出力しないようにする

Last updated at Posted at 2017-05-18

Windowsフォームアプリケーションで、閉じるボタン(ウィンドウ右上の×ボタン)を押した際に終了確認用メッセージボックスを出力したい場合があると思います。しかし、別のアプリケーションからProcessクラスのCloseMainWindow()メソッドを実行してウィンドウを閉じる場合は終了確認用メッセージボックスを出力したくない場合もあるかと思います。その対処法を記述します。

動作確認環境

  • Windows10
  • C# 5.0
  • .NET FrameWork 4.5

サンプル

MainForm.cs
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をセットしています。
これで期待通りの動作を実現できました。

参考

Reference Source - Microsoft

不備がございましたら、ご指摘いただければ幸いです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2