SystemEvents.SessionEnding Evento

Definición

Se produce cuando el usuario intenta cerrar una sesión o apagar el sistema.

C#
public static event Microsoft.Win32.SessionEndingEventHandler SessionEnding;
C#
public static event Microsoft.Win32.SessionEndingEventHandler? SessionEnding;

Tipo de evento

Excepciones

No se admiten las notificaciones de eventos del sistema en el contexto actual. Los procesos del servidor, por ejemplo, quizá no admitan las notificaciones globales de eventos del sistema.

No se ha podido crear correctamente un subproceso de ventana de eventos del sistema.

Comentarios

Este evento se puede cancelar. Al establecer la Cancel propiedad en true , se solicitará que la sesión continúe ejecutándose. No proporciona ninguna garantía de que la sesión no finalice.

Si usa SessionEnding en un formulario Windows Forms para detectar un inicio de sesión o reinicio del sistema, no hay ninguna manera determinista de decidir si el Closing evento se activará antes de este evento.

Si desea realizar algunas tareas especiales antes Closing de que se desencadene, debe asegurarse de que SessionEnding se activa antes Closingde . Para ello, debe interceptar en WM_QUERYENDSESSION el formulario invalidando la WndProc función . En este ejemplo se muestra cómo hacerlo.

C#
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

Las aplicaciones de consola no generan el SessionEnding evento.

Nota

Este evento solo se genera si se está ejecutando la bomba de mensajes. En un servicio de Windows, a menos que se use un formulario oculto o se haya iniciado manualmente la bomba de mensajes, este evento no se generará. Para obtener un ejemplo de código que muestra cómo controlar eventos del sistema mediante un formulario oculto en un servicio de Windows, vea la SystemEvents clase .

Precaución

Dado que se trata de un evento estático, debe desasociar los controladores de eventos cuando se elimina la aplicación o se producirán pérdidas de memoria.

Se aplica a

Producto Versiones
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9

Consulte también