フォームが閉じられる原因を取得する
スポンサーリンク
フォームが閉じられる原因を取得するのには、いくつかの方法が考えられます。その中で 1 番きめ細かく原因を取得できるのは、StackFrame を調べる方法でしょうか。(Form の WndProc メソッドをオーバーライドして、送られてくるメッセージを調べる方法などもあります)
以下の例では、私が把握できたすべての原因を列挙しています。(他にもありましたら、ご報告ください)
サンプルコード
以下にサンプルコードを示します。
J# 全般
private void Form1_Closing(Object sender, System.ComponentModel.CancelEventArgs e) { System.Diagnostics.StackTrace hStack = new System.Diagnostics.StackTrace(true); String nFrame7 = hStack.GetFrame(7).GetMethod().get_Name(); // 7番目のスタックフレームを実行しているメソッド名で判断 if (nFrame7 == "CallWindowProc") { if (hStack.get_FrameCount() > 14) { String nFrame14 = hStack.GetFrame(14).GetMethod().get_Name(); if (nFrame14 == "WmSysCommand") { MessageBox.Show("コントロール メニューから閉じるを選択しました"); } else if(nFrame14 == "WndProc") { MessageBox.Show("Windows のセッションが終了しようとしています"); } } else if(nFrame7 == "SendMessage") { MessageBox.Show("コードから Close メソッドを実行しました"); } else if(nFrame7 == "DefMDIChildProc") { MessageBox.Show("MDI 子フォームを閉じました"); } else if(nFrame7 == "DefFrameProc") { if (this.get_ParentForm() != null) { MessageBox.Show("MDI 親フォームを閉じました"); } } else if(nFrame7 == "RunDialog") { MessageBox.Show("モーダル フォームを閉じました"); } } }
関連するリファレンス
準備中です。