Condividi tramite


SystemEvents.SessionEnding Evento

Definizione

Viene generato quando l'utente tenta di disconnettersi o di arrestare il sistema.

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 

Tipo evento

Eccezioni

Le notifiche degli eventi di sistema non sono supportate nel contesto corrente. I processi server, ad esempio, potrebbero non supportare le notifiche degli eventi di sistema globali.

Il tentativo di creare un thread della finestra degli eventi di sistema non è riuscito.

Commenti

Si tratta di un evento annullabile. L'impostazione della Cancel proprietà su true richiederà che la sessione continui a essere eseguita. Non garantisce che la sessione non finirà.

Se si usa SessionEnding in un modulo di Windows per rilevare un logoff del sistema o un riavvio, non esiste alcun modo deterministico per decidere se l'evento Closing verrà generato prima di questo evento.

Se si desidera eseguire alcune attività speciali prima Closing dell'attivazione, è necessario assicurarsi che SessionEnding venga generato prima Closingdi . A tale scopo, è necessario trappolare il modulo eseguendo l'override WM_QUERYENDSESSION della WndProc funzione. Questo esempio illustra come eseguire questa operazione.

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;  
        }  
    }  
}  

Importante

Le applicazioni console non generano l'evento SessionEnding .

Nota

Questo evento viene generato solo se la pompa del messaggio è in esecuzione. In un servizio Windows, a meno che non venga usato un modulo nascosto o che la pompa del messaggio sia stata avviata manualmente, questo evento non verrà generato. Per un esempio di codice che illustra come gestire gli eventi di sistema usando un modulo nascosto in un servizio Windows, vedere la SystemEvents classe.

Attenzione

Poiché si tratta di un evento statico, è necessario scollegare i gestori eventi quando l'applicazione viene eliminata o le perdite di memoria risulteranno.

Si applica a

Vedi anche