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;

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

Produto Versões
.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

Confira também