views:

257

answers:

4

I have written a C# Windows Forms application, not a service (it is only used when the user is logged in and has a graphical user interface) that has a background thread running in an infinite loop.

When I try shutting down Windows (7) however, it tells me the program is preventing it from shutting down or logging off and asks me whether I want to force a shutdown.

Now, is there any possibility for my program to become aware (get a handler) of Windows trying to quit it or to log off?

So, what I need is to make the application realize when Windows tries to quit.

Thanks in advance.

EDIT: Thanks for the great advice! Is it in any way possible to use the idea with the form closing event if it has a CANCEL event handler?

+2  A: 

I think http://stackoverflow.com/questions/474679/capture-console-exit-c/ should also be usable in your scenario.

Apart from that, maybe it is sufficient to set up your thread as background thread?

flq
A: 

Take a look at the Microsoft.Win32.SystemEvents.SessionEnding event.

Stu Mackellar
+5  A: 
public Form1()
{
    InitializeComponent();

    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // Or any of the other reasons suitable for what you want to accomplish
    if (e.CloseReason == CloseReason.WindowsShutDown)
    {
        //Stop your infinite loop
    }
}
Don
Thanks. This really helped me. I removed the Cancel Handler and used this one, that way, only if it is Windows that closes the application it quits.
arik-so
+4  A: 

You call that thread a "background thread" but does it have IsBackground = true; ?
The system will only stop a thread that does.

Henk Holterman
+1 - that was exactly my thought.
Fredrik Mörk