SystemEvents.SessionEnding Ereignis
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Tritt ein, wenn ein Benutzer versucht, sich abzumelden oder das System herunterzufahren.
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
Ereignistyp
Ausnahmen
Systemereignisbenachrichtigungen werden unter dem aktuellen Kontext nicht unterstützt. Beispielsweise unterstützen Serverprozesse möglicherweise keine globalen Systemereignisbenachrichtigungen.
Beim Versuch, einen Thread für das Systemereignisfenster zu erstellen, ist ein Fehler aufgetreten.
Hinweise
Ein Abbrechen dieses Ereignisses ist möglich. Wenn Sie die Cancel -Eigenschaft auf festlegen true
, wird angefordert, dass die Sitzung weiterhin ausgeführt wird. Es bietet keine Garantie, dass die Sitzung nicht beendet wird.
Wenn Sie SessionEnding in einem Windows-Formular verwenden, um eine Systemabmeldung oder einen Neustart zu erkennen, gibt es keine deterministische Möglichkeit, zu entscheiden, ob das Closing Ereignis vor diesem Ereignis ausgelöst wird.
Wenn Sie einige spezielle Aufgaben ausführen möchten, bevor Closing ausgelöst wird, müssen Sie sicherstellen, dass SessionEnding vor Closingausgelöst wird. Dazu müssen Sie die WM_QUERYENDSESSION
im Formular abfangen, indem Sie die WndProc
-Funktion überschreiben. In diesem Beispiel wird veranschaulicht, wie Dies geschieht.
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;
}
}
}
Wichtig
Konsolenanwendungen lösen das SessionEnding Ereignis nicht aus.
Hinweis
Dieses Ereignis wird nur ausgelöst, wenn die Nachrichtenpumpe ausgeführt wird. In einem Windows-Dienst wird dieses Ereignis nicht ausgelöst, es sei denn, es wird ein ausgeblendetes Formular verwendet oder die Nachrichtenpumpe manuell gestartet. Ein Codebeispiel, das zeigt, wie Systemereignisse mithilfe eines ausgeblendeten Formulars in einem Windows-Dienst behandelt werden, finden Sie in der SystemEvents -Klasse.
Achtung
Da dies ein statisches Ereignis ist, müssen Sie Ihre Ereignishandler trennen, wenn Ihre Anwendung verworfen wird, da sonst Speicherverluste auftreten.