フォームが閉じられた理由を取得する - C#

フォームが閉じられる際の理由を取得するコードを紹介します。

フォームが閉じられる際には、フォームのFormClosedイベントが発生します。FormClosedイベントの引数"FormClosedEventArgs"の"CloseReason"プロパティの値を確認することでフォームが閉じられる理由を取得できます。

FormClosedEventArgs.CloseReasonの値

FormClosedEventArgs.CloseReasonプロパティの値は以下のものがあります。

メンバ名説明
ApplicationExitCallApplication クラスの Exit メソッドが呼び出されました。
FormOwnerClosing所有側のフォームが閉じられようとしています。
MdiFormClosingこのマルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) フォームの親フォームが閉じられようとしています。
Noneフォームが閉じられる理由が定義されなかったか、確認できませんでした。
TaskManagerClosingMicrosoft Windows タスク マネージャがアプリケーションを終了しようとしています。
UserClosingユーザーが、フォーム ウィンドウの [閉じる] ボタンを押す、ウィンドウのコントロール メニューの [閉じる] をクリックする、Alt キーと F4 キーを同時に押すなどの方法で、ユーザー インターフェイス (UI) を通じてフォームを閉じようとしています。
WindowsShutDownオペレーティング システムが終了前にすべてのアプリケーションを終了しようとしています。

UI

以下のUIを準備します。

コード

以下のコードを記述します。フォームのFormClosedイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FormCloseReason
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_FormClosed(object sender, FormClosedEventArgs e)
    {
      switch (e.CloseReason) {
        case CloseReason.ApplicationExitCall:
          MessageBox.Show("Application クラスの Exit メソッドより閉じられます。");
          break;
        case CloseReason.FormOwnerClosing:
          MessageBox.Show("所有側のフォームが閉じられようとしています。 ");
          break;
        case CloseReason.MdiFormClosing:
          MessageBox.Show("このマルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) フォームの親フォームが閉じられようとしています。");
          break;
        case CloseReason.None:
          MessageBox.Show("フォームが閉じられる理由が定義されなかったか、確認できませんでした。");
          break;
        case CloseReason.TaskManagerClosing:
          MessageBox.Show("Microsoft Windows タスク マネージャがアプリケーションを終了しようとしています。");
          break;
        case CloseReason.UserClosing:
          MessageBox.Show("ユーザーが、ユーザー インターフェイス (UI) を通じてフォームを閉じようとしています。 ");
          break;
        case CloseReason.WindowsShutDown:
          MessageBox.Show("オペレーティング システムが終了前にすべてのアプリケーションを終了しようとしています。 ");
          break;
      }
    }
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


ウィンドウの右上の[×]ボタンをクリックしてウィンドウを閉じます。ユーザーインタフェイスからウィンドウが閉じられたことを示すメッセージが表示されます。(下図参照)


タスクマネージャーからアプリケーションを終了した場合は下図のメッセージが表示されます。


補足

Windowメッセージを取得して判定する方法もあります。Windowメッセージを取得する場合はWndProc()メソッドをオーバーライドしウィンドウメッセージを取得します。監視するウィンドウメッセージは以下になります。
  • WM_ENDSESSION = 0x16;
    • Windowsのシャットダウンによりフォームが閉じられる
  • WM_SYSCOMMAND = 0x112 and SC_CLOSE = 0xF060L;
    • ユーザーにより、ユーザーインタフェイス(UI)no操作により閉じられる
  • WM_CLOSE = 0x0010;
    • 上記以外の操作によりウィンドウが閉じられる
のメッセージを取得します。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-05-19
iPentec all rights reserverd.