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 

イベントの種類

SessionEndingEventHandler

例外

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

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

注釈

これはキャンセル可能なイベントです。 Cancelプロパティをに設定する true と、セッションの実行を続行するように要求されます。 セッションが終了しないという保証はありません。

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

を起動する前に特別なタスクを実行する場合は Closing 、が起動されるようにする必要があり SessionEnding Closing ます。 これを行うには、関数をオーバーライドして、フォームのをトラップする必要があり 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

注意事項

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

適用対象

こちらもご覧ください