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


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 этом классе.

Предостережение

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

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

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