SystemEvents.SessionEnding Evento
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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.