SystemEvents.SessionEnding Evento

Definición

Se produce cuando el usuario intenta cerrar una sesión o apagar el 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 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.

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

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

Consulte también