■ VB6 終了の状態を取得

END命令で終了した場合には呼び出されません。
そもそも、END命令で終了すると Class の Private Sub Class_Terminate() も呼ばれませんので扱いには注意が必要です。


▼ 終了を取得するイベント
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End Sub
引数の Cancel に対して、Cancel = True とすると終了を停止する事ができます。


▼ UnloadModeには次の値が入ってきます

vbFormControlMenu
フォームのコントロールメニューから閉じられました

vbFormCode
コード内で Unload が実行されました

vbAppWindows
Windows セッションが終了します

vbAppTaskManager
タスク マネージャによってアプリケーションが閉じられます
(Windows10では拾えませんでした)

vbFormMDIForm
MDIフォームが閉じられました

vbFormOwner
オーナーが閉じられました


▼ シャットダウンを妨げる
OSのシャットダウンを中止できます(強制終了には対応できません)
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If vbAppWindows = UnloadMode Then
        Cancel = True
    End If
End Sub


▼ シャットダウン以外の終了では OK / Cancel の確認メッセージを表示する
シャットダウンではそのまま終了処理に移行する
ただし、確認メッセージの表示中はフォームの動作が停止します(タイマーも停止します)
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If vbAppWindows <> UnloadMode Then
        Dim r As Integer
        r = MsgBox("終了しますか?", vbOKCancel + vbCritical)
        If 2 = r Then
            Cancel = True
            Exit Sub
        End If
    End If
    'ここから終了処理
    'MsgBox ("終了処理")
 
    
    
End Sub

メッセージの表示中にフォームの動作が必要な場合には確認メッセージのフォームを自作する必要があります。
終了イベントが来たらキャンセルしてモードレスで自作フォームを呼びます。
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Cancel = True
    Call Form2.show(vbModeless, Me)
End Sub
確認メッセージのフォームが下に隠れる事はありませんし、複数表示される事もないです。
確認メッセージが出ていても元のフォームは動作し続けます(ボタンやタイマー、その他イベントも動作します)


▲トップページ > Visual BASIC と C#