SystemEvents.SessionEnding 事件
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
当用户尝试注销或关闭系统时发生。
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
事件类型
例外
当前上下文不支持系统事件通知。 例如,服务器进程可能不支持全局系统事件通知。
创建系统事件窗口线程的尝试未成功。
注解
这是可取消的事件。 将 Cancel 属性设置为 true
将请求会话继续运行。 它不保证会话不会结束。
如果在 Windows 窗体中使用 SessionEnding 来检测系统注销或重新启动,则无法确定事件是否 Closing 在此事件之前触发。
如果要在触发 之前 Closing 执行一些特殊任务,则需要确保在 SessionEnding 触发之前 Closing触发 。 为此,需要通过重写 WndProc
函数在 窗体中捕获 WM_QUERYENDSESSION
。 此示例演示如何执行此操作。
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;
}
}
}
重要
控制台应用程序不会引发 事件 SessionEnding 。
注意
仅当消息泵正在运行时,才会引发此事件。 在 Windows 服务中,除非使用隐藏窗体或已手动启动消息泵,否则不会引发此事件。 有关演示如何使用 Windows 服务中的隐藏窗体处理系统事件的代码示例,请参阅 SystemEvents 类。
注意
由于这是静态事件,因此必须在释放应用程序时分离事件处理程序,否则会导致内存泄漏。