SystemEvents.SessionEnding イベント

定義

ユーザーがシステムからログオフしようとした場合、またはシステムをシャットダウンしようとした場合に発生します。

public:
 static event Microsoft::Win32::SessionEndingEventHandler ^ SessionEnding;
public static event Microsoft.Win32.SessionEndingEventHandler SessionEnding;
public static event Microsoft.Win32.SessionEndingEventHandler? SessionEnding;
member this.SessionEnding : Microsoft.Win32.SessionEndingEventHandler 
Public Shared Custom Event SessionEnding As SessionEndingEventHandler 

イベントの種類

例外

システム イベント通知は、現在のコンテキストではサポートされていません。 たとえば、サーバー プロセスがグローバル システム イベント通知をサポートしていない可能性があります。

システム イベント ウィンドウ スレッドの作成が成功しませんでした。

注釈

これは取り消し可能なイベントです。 プロパティを Canceltrue 設定すると、セッションの実行が続行されます。 セッションが終了しないという保証はありません。

Windows フォームで を使用 SessionEnding してシステムのログオフまたは再起動を検出する場合、このイベントの前にイベントが Closing 発生するかどうかを決定する決定的な方法はありません。

が発生する前Closingにいくつかの特別なタスクを実行する場合は、 の前Closingにが発生していることをSessionEnding確認する必要があります。 これを行うには、 関数をオーバーライドして フォーム内の を WM_QUERYENDSESSION トラップする WndProc 必要があります。 この例では、これを行う方法を示します。

Private Shared WM_QUERYENDSESSION As Integer = &H11  
 Private Shared systemShutdown As Boolean = False  
 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)  
     If m.Msg = WM_QUERYENDSESSION Then  
         MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot")  
         systemShutdown = True  
     End If  
     ' If this is WM_QUERYENDSESSION, the closing event should be raised in the base WndProc.  
     MyBase.WndProc(m)  
 End Sub 'WndProc   
 Private Sub Form1_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing  
     If (systemShutdown) Then  
     ' Reset the variable because the user might cancel the shutdown.  
         systemShutdown = False  
         If (System.Windows.Forms.DialogResult.Yes = _  
                 MessageBox.Show("My application", "Do you want to save your work before logging off?", MessageBoxButtons.YesNo)) Then  
                 e.Cancel = True  
         Else  
                 e.Cancel = False  
         End If  
     End If  
 End Sub  
private static int WM_QUERYENDSESSION = 0x11;  
private static bool systemShutdown = false;  
protected override void WndProc(ref System.Windows.Forms.Message m)  
{  
    if (m.Msg==WM_QUERYENDSESSION)  
    {  
        MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");  
        systemShutdown = true;  
    }  

    // If this is WM_QUERYENDSESSION, the closing event should be  
    // raised in the base WndProc.  
    base.WndProc(ref m);  

} //WndProc   

private void Form1_Closing(  
    System.Object sender,   
    System.ComponentModel.CancelEventArgs e)  
{  
    if (systemShutdown)  
        // Reset the variable because the user might cancel the   
        // shutdown.  
    {  
        systemShutdown = false;  
        if (DialogResult.Yes==MessageBox.Show("My application",   
            "Do you want to save your work before logging off?",   
            MessageBoxButtons.YesNo))  
        {  
            e.Cancel = true;  
        }  
        else  
        {  
            e.Cancel = false;  
        }  
    }  
}  

重要

コンソール アプリケーションでは、イベントは SessionEnding 発生しません。

注意

このイベントは、メッセージ ポンプが実行されている場合にのみ発生します。 Windows サービスでは、非表示のフォームが使用されているか、メッセージ ポンプが手動で開始されていない限り、このイベントは発生しません。 Windows サービスで非表示のフォームを使用してシステム イベントを処理する方法を示すコード例については、 クラスを SystemEvents 参照してください。

注意事項

これは静的イベントであるため、アプリケーションが破棄されるときにイベント ハンドラーをデタッチする必要があります。または、メモリ リークが発生します。

適用対象

こちらもご覧ください