J#(Java)フォームが閉じられる原因を取得する

スポンサーリンク

フォームが閉じられる原因を取得するのには、いくつかの方法が考えられます。その中で 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("モーダル フォームを閉じました");
        }
    }
}

関連するリファレンス

準備中です。

スポンサーリンク