Freigeben über


SystemEvents.SessionEnding Ereignis

Definition

Tritt ein, wenn ein Benutzer versucht, sich abzumelden oder das System herunterzufahren.

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 

Ereignistyp

Ausnahmen

Systemereignisbenachrichtigungen werden unter dem aktuellen Kontext nicht unterstützt. Beispielsweise unterstützen Serverprozesse möglicherweise keine globalen Systemereignisbenachrichtigungen.

Beim Versuch, einen Thread für das Systemereignisfenster zu erstellen, ist ein Fehler aufgetreten.

Hinweise

Ein Abbrechen dieses Ereignisses ist möglich. Wenn Sie die Cancel -Eigenschaft auf festlegen true , wird angefordert, dass die Sitzung weiterhin ausgeführt wird. Es bietet keine Garantie, dass die Sitzung nicht beendet wird.

Wenn Sie SessionEnding in einem Windows-Formular verwenden, um eine Systemabmeldung oder einen Neustart zu erkennen, gibt es keine deterministische Möglichkeit, zu entscheiden, ob das Closing Ereignis vor diesem Ereignis ausgelöst wird.

Wenn Sie einige spezielle Aufgaben ausführen möchten, bevor Closing ausgelöst wird, müssen Sie sicherstellen, dass SessionEnding vor Closingausgelöst wird. Dazu müssen Sie die WM_QUERYENDSESSION im Formular abfangen, indem Sie die WndProc -Funktion überschreiben. In diesem Beispiel wird veranschaulicht, wie Dies geschieht.

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

Konsolenanwendungen lösen das SessionEnding Ereignis nicht aus.

Hinweis

Dieses Ereignis wird nur ausgelöst, wenn die Nachrichtenpumpe ausgeführt wird. In einem Windows-Dienst wird dieses Ereignis nicht ausgelöst, es sei denn, es wird ein ausgeblendetes Formular verwendet oder die Nachrichtenpumpe manuell gestartet. Ein Codebeispiel, das zeigt, wie Systemereignisse mithilfe eines ausgeblendeten Formulars in einem Windows-Dienst behandelt werden, finden Sie in der SystemEvents -Klasse.

Achtung

Da dies ein statisches Ereignis ist, müssen Sie Ihre Ereignishandler trennen, wenn Ihre Anwendung verworfen wird, da sonst Speicherverluste auftreten.

Gilt für:

Weitere Informationen