Microsoft.Win32.SystemEvents.SessionEnding Event

Occurs when the user is trying to log off or shut down the system.

Syntax

[System.MonoTODO("Currently does nothing on Mono")]
public static event SessionEndingEventHandler SessionEnding

Remarks

This is a cancelable event. Setting the SessionEndingEventArgs.Cancel property to true will request that the session continues to run. It provides no guarantee that the session will not end.

If you are using SystemEvents.SessionEnding in a Windows form to detect a system logoff or reboot, there is no deterministic way to decide whether the System.Windows.Forms.Form.Closing event will fire before this event.

If you want to perform some special tasks before System.Windows.Forms.Form.Closing is fired, you need to ensure that SystemEvents.SessionEnding fires before System.Windows.Forms.Form.Closing. 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.

Example

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

Example

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;
        }
    }
}
Note:

Console applications do not raise the SystemEvents.SessionEnding event.

Note:

This event is only raised if the message pump is running. In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. For a code example that shows how to handle system events by using a hidden form in a Windows service, see the Microsoft.Win32.SystemEvents class.

Note:

Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

Requirements

Namespace: Microsoft.Win32
Assembly: System (in System.dll)
Assembly Versions: 1.0.5000.0, 2.0.0.0, 4.0.0.0