SystemEvents.SessionEnding SystemEvents.SessionEnding SystemEvents.SessionEnding SystemEvents.SessionEnding Event

定義

ユーザーがシステムからログオフしようとした場合、またはシステムをシャットダウンしようとした場合に発生します。Occurs when the user is trying to log off or shut down the system.

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 

例外

システム イベント通知は、現在のコンテキストではサポートされていません。System event notifications are not supported under the current context. たとえば、サーバー プロセスがグローバル システム イベント通知をサポートしていない可能性があります。Server processes, for example, might not support global system event notifications.

システム イベント ウィンドウ スレッドの作成が成功しませんでした。The attempt to create a system events window thread did not succeed.

注釈

これは、キャンセルできるイベントです。This is a cancelable event. 設定、Cancelプロパティをtrueセッションが引き続き実行を要求します。Setting the Cancel property to true will request that the session continues to run. セッションは終了しません保証ではありません。It provides no guarantee that the session will not end.

使用する場合SessionEnding、システムのログオフまたは再起動を検出するために Windows フォームでは、確定的な方法を決定するはないかどうか、Closingイベントは、このイベントの前に発生します。If you are using SessionEnding in a Windows form to detect a system logoff or reboot, there is no deterministic way to decide whether the Closing event will fire before this event.

前にいくつかの特別なタスクを実行したい場合Closingはことを確認する必要があります、SessionEndingに先に発生ClosingIf you want to perform some special tasks before Closing is fired, you need to ensure that SessionEnding fires before Closing. これを行うには、トラップする必要があります、WM_QUERYENDSESSIONオーバーライドすることで、フォームで、WndProc関数。To do this, you need to trap the WM_QUERYENDSESSION in the form by overriding the WndProc function. この例では、これを行う方法を示します。This example demonstrates how to do this.

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イベント。Console applications do not raise the SessionEnding event.

注意

このイベントは、メッセージ ポンプが実行されている場合にだけ発生します。This event is only raised if the message pump is running. Windows サービスで非表示フォームを使用してまたはメッセージ ポンプが手動で開始された場合を除き、このイベントは発生しません。In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. Windows サービスで非表示のフォームを使用してシステム イベントを処理する方法を示すコード例については、SystemEventsクラス。For a code example that shows how to handle system events by using a hidden form in a Windows service, see the SystemEvents class.

注意事項

静的イベントであるため、アプリケーションが破棄されると、またはメモリ リークが発生するとき、イベント ハンドラーをデタッチする必要があります。Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

適用対象

こちらもご覧ください