SystemEvents.SessionEnding 事件

定义

当用户尝试注销或关闭系统时发生。

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

注意

由于这是静态事件,因此必须在释放应用程序时分离事件处理程序,否则会导致内存泄漏。

适用于

另请参阅