VB.NETフォームが閉じられる原因を取得する

スポンサーリンク

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

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

サンプルコード

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

VB.NET 全般
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    Dim hStack As New System.Diagnostics.StackTrace(True)

    ' 7番目のスタックフレームを実行しているメソッド名で判断
    Select Case hStack.GetFrame(7).GetMethod().Name
        Case "CallWindowProc"
            If hStack.FrameCount > 14 Then
                Select Case hStack.GetFrame(14).GetMethod().Name
                    Case "WmSysCommand"
                        MessageBox.Show("コントロール メニューから閉じるを選択しました")
                    Case "WndProc"
                        MessageBox.Show("Windows のセッションが終了しようとしています")
                End Select
            End If
        Case "SendMessage"
            MessageBox.Show("コードから Close メソッドを実行しました")
        Case "DefMDIChildProc"
            MessageBox.Show("MDI 子フォームを閉じました")
        Case "DefFrameProc"
            If Not Me.ParentForm Is Nothing Then
                MessageBox.Show("MDI 親フォームを閉じました")
            End If
        Case "RunDialog"
            MessageBox.Show("モーダル フォームを閉じました")
    End Select
End Sub

関連するリファレンス

準備中です。

スポンサーリンク