C# .Net and Window Shutdown detection

Started by
7 comments, last by FenixRoA 17 years, 5 months ago
The subject-line says most of it. I am using C# and .Net but if you have a general method please post it and I'll try to apply it in C#. My particular program needs to be aware if it is the user shutting it down or if it is windows. Also, if it is Windows, it needs to be able to detect if Windows has shut it down because Windows itself is shutting down. If anyone knows how to make this happen, please post. Thanks guys, ~B
Advertisement
I know that System.Windows.Forms have two events, FormClosing and FormClosed. FormClosing fires before a form has closed, and FormClosed fires after.

Both events pass an EventArgs, one of the properties is a CloseReason enum.

Example:

        private void ViewerForm_FormClosing(object sender, FormClosingEventArgs e)        {            if (e.CloseReason == CloseReason.WindowsShutDown)            {                //Windows is shutting down!            }        }


See MSDN for details, but that should put you on the right track.
FormClose may come too late, when your app is already shut down. If you need to do some cleanup you'd have to listen to WM_ENDSESSION and do the appropriate action.

I'm not sure if there's a .NET equivalent to that Win32 message so you may have to resort to overriding WindowProc.

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

Kryat: That's a really simple way to do it that I did not know about. Thanks for that, however, I am not using a Form. My program hides in the system tray and instantiates a form whenever it is doubleclicked or the appropriate selection is made from it's context menu.

Would your method still work? and how would I go about registering my own "FormClosing" and "FormClosed" event handlers without changing my base class to a form?

Endurion: I'm going to look up what that entails exactly, as I've never done it in C#. Thanks for the submission.
Have a look at SystemEvents.SessionEnding.
ReactOS - an Open-source operating system compatible with Windows NT apps and drivers
Just realized I'm not being very clear.

Forgot to mention my main program is an "ApplicationContext" and the message loop is being handled by Application.Run().

So I don't think I can get into the FormClosed/Closing events, but if you can think of a way I can, all the better.

For the bigger picture all I need to be able to tell the difference whether Windows is shutting down or if the user used "Ctrl+Alt+Del" and "End Task" to quit the program. (I'm already handling in case the user uses "Kill Process", so this leaves me with handling shutdown vs, end task).

Thanks again,
~FenixRoA
Martee: Thanks, I'm going to check that out now.

EDIT:
Thanks Martee, that looks EXACTLY like what I'm looking for.
I'm going to give it a shot.
Hmm... So close.

I don't really know how to hook into Windows Messages. Problem is, again, I'm NOT using a Form class. It is just an ApplicationContext. Therefore there is no WndProc method to override.

If you guys know how I could hook into the windows messages, that would be great.

Thanks,
~B
Actually nevermind Martee. Your recommendation appears like it will work.

My mistake, I looked at the sample code which doesn't use the said event.

Thanks, much appreciated
~FenixRoA

This topic is closed to new replies.

Advertisement