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.

Если вы используете SessionEnding в Windows Forms для обнаружения выхода из системы или перезагрузки, нет детерминированного способа решить, будет ли событие 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 необходимо выполнить некоторые специальные задачи, необходимо убедиться, что SessionEnding срабатывает перед Closing.If you want to perform some special tasks before Closing is fired, you need to ensure that SessionEnding fires before Closing. Для этого необходимо перехватить WM_QUERYENDSESSION в форме, переопределив функцию WndProc.To 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.

Применяется к

Дополнительно