C#フォームが閉じられる原因を取得する

スポンサーリンク

フォームが閉じられる原因を取得するのには、いくつかの方法が考えられます。その中で 1 番きめ細かく原因を取得できるのは、StackFrame を調べる方法でしょうか。(Form の WndProc メソッドをオーバーライドして、送られてくるメッセージを調べる方法などもあります)

以下の例では、私が把握できたすべての原因を列挙しています。(他にもありましたら、ご報告ください)

サンプルコード

以下にサンプルコードを示します。

C# 全般
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
    System.Diagnostics.StackTrace hStack = new System.Diagnostics.StackTrace(true);

    // 7番目のスタックフレームを実行しているメソッド名で判断
    switch (hStack.GetFrame(7).GetMethod().Name) {
        case "CallWindowProc":
            if (hStack.FrameCount > 14) {
                switch (hStack.GetFrame(14).GetMethod().Name) {
                    case "WmSysCommand":
                        MessageBox.Show("コントロール メニューから閉じるを選択しました");
                        break;
                    case "WndProc":
                        MessageBox.Show("Windows のセッションが終了しようとしています");
                        break;
                }
            }
            break;
        case "SendMessage":
            MessageBox.Show("コードから Close メソッドを実行しました");
            break;
        case "DefMDIChildProc":
            MessageBox.Show("MDI 子フォームを閉じました");
            break;
        case "DefFrameProc":
            if (this.ParentForm != null) {
                MessageBox.Show("MDI 親フォームを閉じました");
            }
            break;
        case "RunDialog":
            MessageBox.Show("モーダル フォームを閉じました");
            break;
    }
}

関連するリファレンス

準備中です。

スポンサーリンク