.NET Framework Class Library
SystemEvents..::.SessionEnding Event

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

Namespace:  Microsoft.Win32
Assembly:  System (in System.dll)
Syntax

Visual Basic (Declaration)
Public Shared Event SessionEnding As SessionEndingEventHandler
Visual Basic (Usage)
Dim handler As SessionEndingEventHandler

AddHandler SystemEvents.SessionEnding, handler
C#
public static event SessionEndingEventHandler SessionEnding
Visual C++
public:
static  event SessionEndingEventHandler^ SessionEnding {
    void add (SessionEndingEventHandler^ value);
    void remove (SessionEndingEventHandler^ value);
}
JScript
JScript does not support events.
Exceptions

ExceptionCondition
InvalidOperationException

System event notifications are not supported under the current context. Server processes, for example, might not support global system event notifications.

ExternalException

The attempt to create a system events window thread did not succeed.

Remarks

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

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.

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

Visual Basic
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
C#
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;
        }
    }
}
Important noteImportant Note:

Console applications do not raise the SessionEnding event.

NoteNote:

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 SystemEvents class.

Caution noteCaution:

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

Platforms

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Version Information

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0
See Also

Reference

Tags :


Community Content

gutharius
Here is a better more functional example:

Microsofts example limits what you can do functionally, I found the below example to be INFINITELY more functional and easier to understand.


Imports Microsoft.Win32
Imports System.ServiceProcess
Imports System.Threading
Public Class Form1
Public Shared SessionEndingDetected As Boolean = False

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Setup the event listener as a new thread.
Dim oListen As New Listener 'See Listener Class Below
Dim t As New Threading.Thread(AddressOf oListen.Listen) 'Declare the thread
'Start the thread and let it run while we do other things.
'When a reboot\logoff\shutdown occurs the Global Shared Variable "SessionEndingDetected" is
'set to true via the background thread. The global variable MUST BE Shared for this to work.
t.Start()
While SessionEndingDetected = False









Threading.Thread.Sleep(500) 'Simulate some work while we wait for a reboot/shutdown/logoff
End While


Me.Close()
End Sub
Public Sub SystemShutDownDetected(ByVal sender As System.Object, ByVal e As SessionEndingEventArgs)
SessionEndingDetected = True
End Sub
End Class
Public Class Listener
Public Sub Listen()
Try
AddHandler Microsoft.Win32.SystemEvents.SessionEnding, _
New SessionEndingEventHandler(AddressOf Form1.SystemShutDownDetected)
Catch ex As Exception
End Try
End Sub
End Class
Tags :

Page view tracker