Partilhar via


SystemEvents.SessionEnding Evento

Definição

Ocorre quando o usuário está tentando fazer logoff ou desligar o 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

Exceções

Não há suporte para notificações de eventos do sistema no contexto atual. Os processos do servidor, por exemplo, podem não dar suporte a notificações de eventos globais do sistema.

A tentativa de criar um thread de janela de eventos do sistema não foi bem-sucedida.

Comentários

Esse é um evento cancelável. Definir a Cancel propriedade como true solicitará que a sessão continue a ser executada. Ele não fornece nenhuma garantia de que a sessão não terminará.

Se você estiver usando SessionEnding em um formulário do Windows para detectar um logoff ou reinicialização do sistema, não há nenhuma maneira determinística de decidir se o Closing evento será acionado antes desse evento.

Se você quiser executar algumas tarefas especiais antes Closing de ser acionado, precisará garantir que seja SessionEnding acionado antes Closingde . Para fazer isso, você precisa interceptar o WM_QUERYENDSESSION no formulário substituindo a WndProc função . Este exemplo demonstra como fazer isso.

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

Os aplicativos de console não geram o SessionEnding evento.

Observação

Esse evento só será gerado se a bomba de mensagem estiver em execução. Em um serviço windows, a menos que um formulário oculto seja usado ou a bomba de mensagem tenha sido iniciada manualmente, esse evento não será gerado. Para obter um exemplo de código que mostra como lidar com eventos do sistema usando um formulário oculto em um serviço Windows, consulte a SystemEvents classe .

Cuidado

Como esse é um evento estático, você deve desanexar seus manipuladores de eventos quando o aplicativo for descartado ou os vazamentos de memória resultarão.

Aplica-se a

Confira também