SystemEvents.SessionEnding Ereignis

Definition

Tritt ein, wenn ein Benutzer versucht, sich abzumelden oder das System herunterzufahren.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 

Ausnahmen

Systemereignisbenachrichtigungen werden unter dem aktuellen Kontext nicht unterstützt.System event notifications are not supported under the current context. Beispielsweise unterstützen Serverprozesse möglicherweise keine globalen Systemereignisbenachrichtigungen.Server processes, for example, might not support global system event notifications.

Beim Versuch, einen Thread für das Systemereignisfenster zu erstellen, ist ein Fehler aufgetreten.The attempt to create a system events window thread did not succeed.

Hinweise

Ein Abbrechen dieses Ereignisses ist möglich.This is a cancelable event. Wenn Sie die Cancel-Eigenschaft auf true festlegen, wird die Fortführung der Sitzung angefordert.Setting the Cancel property to true will request that the session continues to run. Es bietet keine Garantie dafür, dass die Sitzung nicht beendet wird.It provides no guarantee that the session will not end.

Wenn Sie SessionEnding in einem Windows Form verwenden, um eine System Abmeldung oder einen Neustart zu erkennen, gibt es keine deterministische Möglichkeit zu entscheiden, ob das Closing Ereignis vor diesem Ereignis ausgelöst wird.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.

Wenn Sie vor dem Auslösen Closing einige besondere Aufgaben ausführen möchten, müssen Sie sicherstellen, dass SessionEnding vor Closingausgelöst wird.If you want to perform some special tasks before Closing is fired, you need to ensure that SessionEnding fires before Closing. Zu diesem Zweck müssen Sie die WM_QUERYENDSESSION im Formular durch Überschreiben der WndProc-Funktion abfangen.To do this, you need to trap the WM_QUERYENDSESSION in the form by overriding the WndProc function. Diese Vorgehensweise wird in diesem Beispiel veranschaulicht.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;  
        }  
    }  
}  

Wichtig

Konsolen Anwendungen erhöhen das SessionEnding-Ereignis nicht.Console applications do not raise the SessionEnding event.

Hinweis

Dieses Ereignis wird nur ausgelöst, wenn das nachrichtenpump ausgeführt wird.This event is only raised if the message pump is running. In einem Windows-Dienst wird dieses Ereignis nicht ausgelöst, es sei denn, es wird ein ausgeblendetes Formular verwendet, oder das nachrichtenpump wurde manuell gestartet.In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. Ein Codebeispiel, das zeigt, wie Systemereignisse mithilfe eines verborgenen Formulars in einem Windows-Dienst behandelt werden, finden Sie in der SystemEvents-Klasse.For a code example that shows how to handle system events by using a hidden form in a Windows service, see the SystemEvents class.

Achtung

Da es sich hierbei um ein statisches Ereignis handelt, müssen Sie die Ereignishandler trennen, wenn die Anwendung verworfen wird, oder die Arbeitsspeicher Verluste entstehen.Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

Gilt für:

Siehe auch