How to detect Windows shutdown or logoff
Attach an event handler method to the SystemEvents.SessionEnding
event, and your handler method will be called each time the event is raised. Handling this event will allow you to cancel the pending log off or shut down, if you wish. (Although that doesn't actually work like it sounds in current operating systems; for more information see the MSDN documentation here.)
If you don't want to cancel the event, but just react to it appropriately, you should handle the SystemEvents.SessionEnded
event instead.
You must make sure that you detach your event handlers when the application is closed, however, because both of these are static events.
detect shutdown in window service
For a shutdown, override the OnShutdown method:
protected override void OnShutdown()
{
//your code here
base.OnShutdown();
}
For a logoff:
First, add an event handler to Microsoft.Win32.SystemEvents.SessionEnded in the Service Constructor:
public MyService()
{
InitializeComponent;
Microsoft.Win32.SystemEvents.SessionEnded += new Microsoft.Win32.SessionEndedEventHandler(SystemEvents_SessionEnded);
}
Then add the handler:
void SystemEvents_SessionEnded(object sender, Microsoft.Win32.SessionEndedEventArgs e)
{
//your code here
}
This should catch any ended session, including the console itself (the one running the services).
How to detect Windows shutdown or logoff in Qt
If you are using the Qt event loop, you can catch the following signal:
void QCoreApplication::aboutToQuit() [signal]
This signal is emitted when the application is about to quit the main event loop, e.g. when the event loop level drops to zero. This may happen either after a call to quit() from inside the application or when the users shuts down the entire desktop session.
The signal is particularly useful if your application has to do some last-second cleanup. Note that no user interaction is possible in this state.
Other than that, you may be looking for the following messages below if the aforementioned signal is not appropriate for your use case:
WM_QUIT: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632641(v=vs.85).aspx
WM_CLOSE: http://msdn.microsoft.com/en-us/library/windows/desktop/ms632617(v=vs.85).aspx
WM_QUERYENDSESSION: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376890.aspx
WM_ENDSESSION: http://msdn.microsoft.com/en-US/library/windows/desktop/aa376889.aspx
C# - How to detect a Windows shutdown/logoff and cancel that action (after asking the user)
There is a static class called SystemEvents
that exposes this behaviour:
http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx
However, it cannot differentiate between certain actions and doesn't pause the OS process time-out guard. I used it once, but the default time-out as configured in the registry is a little short so will likely need increasing.
To cut a long story short, it all felt a little hackish.
Related Topics
What Strategies and Tools Are Useful for Finding Memory Leaks in .Net
Replace Multiple Characters in a C# String
How to Get Variable Name Using Reflection
Making Entity Class Closed for Changes
Ienumerable and Recursion Using Yield Return
How to Correctly Cast a Class to an Abstract Class When Using Type Generics
Differencebetween "X Is Null" and "X == Null"
Nullable Type Issue with : Conditional Operator
Is It Considered Acceptable to Not Call Dispose() on a Tpl Task Object
Recursively Get Properties & Child Properties of a Class
Adding Items to a List<> of Objects Results in Duplicate Objects When Using a New in a Loop
When Should I Use "Using" Blocks in C#
How to Access Backing Fields Behind Auto-Implemented Properties