C# Windows application prevents Windows from shutting down / logging off
Asked Answered
A

4

6

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?

Albuminoid answered 23/3, 2010 at 8:27 Comment(1)
Can you quit your application by clicking on close button at the top right corner? If that's the case app shouldn't prevent the shutdown. Otherwise you need to handle that scenario first.Jugglery
C
12
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
    }
}
Clamper answered 23/3, 2010 at 8:42 Comment(1)
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.Albuminoid
E
5

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

Expander answered 23/3, 2010 at 8:43 Comment(0)
S
2

I think 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?

Sycamine answered 23/3, 2010 at 8:35 Comment(0)
W
1

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

Wellread answered 23/3, 2010 at 8:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.