VB.NET Tips - フォームが閉じるのをキャンセルする方法

フォームが閉じる方法としては、自分のプログラムの中で Close を呼出すか、 またはウインドウの右上に表示された「X」をクリックするか、「Alt + F4」を押下するかになります。

この場合にフォームのイベントとしては FormClosingFormClosed がその順番に発生します。
FormClosing は呼び出された関数の引数として FormClosingEventArgs を持ち、 その中のプロパティである CloseReason を調べることで、閉じられた原因が分かります。

MSDNの説明によれば以下の様になっています。

FormClosingEventArgsについて

CloseReason :フォームの終了理由を示す値
    ApplicationExitCall :Application.Exitによる
    FormOwnerClosing    :所有側のフォームが閉じられようとしている
    MdiFormClosing      :MDIの親フォームが閉じられようとしている
    TaskManagerClosing  :タスクマネージャによる
    UserClosing         :ユーザーインターフェイスによる
    WindowsShutDown     :OSのシャットダウンによる
    None                :未知の理由
・Cancel:イベントをキャンセルする必要があるかどうかを示す値を設定します。
    True    :フォームを閉じない
    False   :フォームを閉じる

以下のソースは、フォームの中に「ボタンでのクローズ指示フラグ」を宣言し、 ボタン押下時にはそのフラグをONして自分のフォームを Close しています。

フォーム右上「X」を押下したり、「Alt+F4」でウインドウを閉じる時にも フォームFormClosingイベントが発生しますが、ボタンでのクローズなのかを上記のフラグで区別しています。

フォームFormClosingイベントで CloseReason.UserClosing の場合しか処理しない様にしていますので、 その他のシャットダウン時等のクローズでは、素通りとなり、次のフォームFormClosedイベントへと移ります。

フォームが閉じるのをキャンセルする方法

01Public Class frmClose
02 
03    'ボタンでのクローズ指示フラグ
04    Private mblnButtonClose As Boolean = False
05 
06    ''' <summary>
07    ''' ボタンクリックイベント
08    ''' </summary>
09    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
10        Me.mblnButtonClose = True
11        Me.Close()
12    End Sub
13 
14    ''' <summary>
15    ''' フォームFormClosingイベント
16    ''' </summary>
17    Private Sub frmClose_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
18        If e.CloseReason = CloseReason.UserClosing Then
19            'ボタンでのクローズかチェック
20            If mblnButtonClose = False Then
21                'ボタンでは無い場合
22                Dim strDsp As String = "ウインドウ右上の[X]または[Alt + F4]で閉じようとしています。" _
23                                       & vbCrLf & "よろしいですか?"
24                If MsgBox(strDsp, MsgBoxStyle.YesNo, "クローズテスト") = MsgBoxResult.No Then
25                    '「いいえ」⇒閉じるのを止める
26                    e.Cancel = True
27                End If
28            End If
29        End If
30    End Sub
31 
32    ''' <summary>
33    ''' フォームFormClosedイベント
34    ''' </summary>
35    Private Sub frmClose_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
36        'ここで通常はオブジェクトの廃棄等を行う
37    End Sub
38 
39End Class

以下の画像は、フォーム右上「X」を押下した時の様子です。

総アクセス数