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

Définition

Se produit lorsque l'utilisateur essaie de fermer une session ou d'arrêter le système.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 

Exceptions

Les notifications d'événements système ne sont pas prises en compte dans le contexte actuel.System event notifications are not supported under the current context. Les processus serveur, par exemple, risquent de ne pas prendre en charge les notifications d'événements système globaux.Server processes, for example, might not support global system event notifications.

La tentative de création d'un thread de fenêtre des événements système a échoué.The attempt to create a system events window thread did not succeed.

Remarques

Cet événement peut être annulé.This is a cancelable event. L’affectation Cancel de la true valeur à la propriété demande que la session continue à s’exécuter.Setting the Cancel property to true will request that the session continues to run. Elle ne garantit pas que la session ne se termine pas.It provides no guarantee that the session will not end.

Si vous utilisez SessionEnding dans un Windows Form pour détecter une déconnexion ou un redémarrage du système, il n’existe aucun moyen déterministe Closing de déterminer si l’événement se déclenche avant cet événement.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.

Si vous souhaitez effectuer des tâches spéciales avant Closing le déclenchement de, vous devez vous assurer que SessionEnding se déclenche avant. ClosingIf you want to perform some special tasks before Closing is fired, you need to ensure that SessionEnding fires before Closing. Pour ce faire, vous devez intercepter le WM_QUERYENDSESSION dans le formulaire en remplaçant la WndProc fonction.To do this, you need to trap the WM_QUERYENDSESSION in the form by overriding the WndProc function. Cet exemple montre comment effectuer cette opération.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;  
        }  
    }  
}  

Important

Les applications console ne déclenchent SessionEnding pas l’événement.Console applications do not raise the SessionEnding event.

Notes

Cet événement est déclenché uniquement si la pompe de messages est en cours d’exécution.This event is only raised if the message pump is running. Dans un service Windows, sauf si un formulaire masqué est utilisé ou si la pompe de messages a été démarrée manuellement, cet événement n’est pas déclenché.In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. Pour obtenir un exemple de code qui montre comment gérer des événements système à l’aide d’un formulaire masqué dans un service SystemEvents Windows, consultez la classe.For a code example that shows how to handle system events by using a hidden form in a Windows service, see the SystemEvents class.

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.Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

S’applique à

Voir aussi