Поделиться через


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 будет запрашиваться продолжение выполнения сеанса. Он не гарантирует, что сеанс не завершится.

Если вы используете SessionEnding в форме Windows для обнаружения выхода системы из системы или перезагрузки, детерминированного способа определить, будет ли Closing событие срабтать до этого события, не существует детерминированного способа.

Если вы хотите выполнить некоторые специальные задачи до Closing запуска , необходимо убедиться, что SessionEnding срабатывает до Closing. Для этого необходимо отловить WM_QUERYENDSESSION в форме, переопределив функцию WndProc . В этом примере показано, как это сделать.

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 классе .

Внимание!

Так как это статическое событие, необходимо отключить обработчики событий при удалении приложения, иначе произойдет утечка памяти.

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

См. также раздел