SystemEvents.SessionEnding 事件

定义

当用户尝试注销或关闭系统时发生。Occurs when the user is trying to log off or shut down the system.

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 

例外

当前上下文不支持系统事件通知。System event notifications are not supported under the current context. 例如,服务器进程可能不支持全局系统事件通知。Server processes, for example, might not support global system event notifications.

创建系统事件窗口线程的尝试未成功。The attempt to create a system events window thread did not succeed.

注解

这是一个可取消的事件。This is a cancelable event. Cancel 属性设置为 "true 将请求继续运行会话。Setting the Cancel property to true will request that the session continues to run. 它不保证会话不会结束。It provides no guarantee that the session will not end.

如果在 Windows 窗体中使用 SessionEnding 来检测系统注销或重新启动,则没有确定的方法来确定是否将在此事件之前激发 Closing 事件。If you are using SessionEnding in a Windows form to detect a system logoff or reboot, there is no deterministic way to decide whether the Closing event will fire before this event.

如果要在激发 Closing 之前执行一些特殊任务,需要确保 SessionEndingClosing之前激发。If you want to perform some special tasks before Closing is fired, you need to ensure that SessionEnding fires before Closing. 为此,需要通过重写 WndProc 函数来捕获窗体中的 WM_QUERYENDSESSIONTo do this, you need to trap the WM_QUERYENDSESSION in the form by overriding the WndProc function. 此示例演示如何执行此操作。This example demonstrates how to do this.

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 事件。Console applications do not raise the SessionEnding event.

备注

仅当消息泵正在运行时才引发此事件。This event is only raised if the message pump is running. 在 Windows 服务中,除非使用隐藏的窗体或手动启动了消息泵,否则将不会引发此事件。In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. 有关演示如何使用 Windows 服务中的隐藏窗体处理系统事件的代码示例,请参阅 SystemEvents 类。For a code example that shows how to handle system events by using a hidden form in a Windows service, see the SystemEvents class.

注意

因为这是一个静态事件,所以必须在释放应用程序时分离事件处理程序,否则会导致内存泄漏。Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

适用于

另请参阅