Partager via


SystemEvents.SessionEnding Événement

Définition

Se produit lorsque l'utilisateur essaie de fermer une session ou d'arrêter le système.

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 

Type d'événement

Exceptions

Les notifications d'événements système ne sont pas prises en compte dans le contexte actuel. Les processus serveur, par exemple, risquent de ne pas prendre en charge les notifications d'événements système globaux.

La tentative de création d'un thread de fenêtre des événements système a échoué.

Remarques

Cet événement peut être annulé. La définition de la Cancel propriété sur true demande que la session continue à s’exécuter. Il n’offre aucune garantie que la session ne se terminera pas.

Si vous utilisez SessionEnding dans un formulaire Windows pour détecter une fermeture de session ou un redémarrage du système, il n’existe aucun moyen déterministe de décider si l’événement Closing se déclenchera avant cet événement.

Si vous souhaitez effectuer des tâches spéciales avant Closing le déclenchement, vous devez vous assurer que SessionEnding se déclenche avant Closing. Pour ce faire, vous devez intercepter le WM_QUERYENDSESSION dans le formulaire en remplaçant la WndProc fonction . Cet exemple montre comment procéder.

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

Important

Les applications console ne déclenchent pas l’événement SessionEnding .

Notes

Cet événement est déclenché uniquement si la pompe de messages est en cours d’exécution. Dans un service Windows, sauf si un formulaire masqué est utilisé ou que la pompe de messages a été démarrée manuellement, cet événement n’est pas déclenché. Pour obtenir un exemple de code qui montre comment gérer les événements système à l’aide d’un formulaire masqué dans un service Windows, consultez la SystemEvents classe .

Attention

S'agissant d'un événement statique, vous devez détacher vos gestionnaires d’événements lorsque votre application est supprimée, faute de quoi des fuites mémoire vont se produire.

S’applique à

Voir aussi