SystemEvents.SessionEnding Zdarzenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Występuje, gdy użytkownik próbuje wylogować się lub zamknąć system.
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
Typ zdarzenia
Wyjątki
Powiadomienia o zdarzeniach systemowych nie są obsługiwane w bieżącym kontekście. Na przykład procesy serwera mogą nie obsługiwać globalnych powiadomień o zdarzeniach systemowych.
Próba utworzenia wątku okna zdarzeń systemowych nie powiodła się.
Uwagi
Jest to zdarzenie, które można anulować. Cancel Ustawienie właściwości true
na wartość spowoduje żądanie, że sesja będzie nadal działać. Nie zapewnia żadnej gwarancji, że sesja nie zakończy się.
Jeśli używasz SessionEnding w formularzu systemu Windows do wykrywania wylogowania lub ponownego uruchamiania systemu, nie ma deterministycznego sposobu decydowania, czy Closing zdarzenie zostanie uruchomione przed tym zdarzeniem.
Jeśli chcesz wykonać kilka specjalnych zadań przed Closing wyzwoleniem, musisz upewnić się, że SessionEnding działa przed Closing. Aby to zrobić, należy wychwytować WM_QUERYENDSESSION
w formularzu przez zastąpienie WndProc
funkcji. W tym przykładzie pokazano, jak to zrobić.
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;
}
}
}
Ważne
Aplikacje konsolowe nie zgłaszają zdarzenia SessionEnding .
Uwaga
To zdarzenie jest zgłaszane tylko wtedy, gdy pompa komunikatów jest uruchomiona. W usłudze systemu Windows, chyba że zostanie użyty ukryty formularz lub pompa komunikatów została uruchomiona ręcznie, to zdarzenie nie zostanie podniesione. Aby zapoznać się z przykładem kodu pokazującym sposób obsługi zdarzeń systemowych przy użyciu ukrytego formularza w usłudze systemu Windows, zobacz klasę SystemEvents .
Przestroga
Ponieważ jest to zdarzenie statyczne, należy odłączyć programy obsługi zdarzeń, gdy aplikacja zostanie usunięta, lub wystąpią przecieki pamięci.