8

I am doing an application which is used to clear the Temp files, history etc, when the user log off. So how can I know if the system is going to logoff (in C#)?

Dave Clemmer
  • 3,741
  • 12
  • 49
  • 72
Sauron
  • 16,668
  • 41
  • 122
  • 174

4 Answers4

10

There is a property in Environment class that tells about if shutdown process has started:

Environment.HasShutDownStarted

But after some googling I found out that this may be of help to you:

 using Microsoft.Win32;

 //during init of your application bind to this event  
 SystemEvents.SessionEnding += 
            new SessionEndingEventHandler(SystemEvents_SessionEnding);

 void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
 {
     if (Environment.HasShutdownStarted)
     {
         //Tackle Shutdown
     }
     else
     {
         //Tackle log off
     }
  }

But if you only want to clear temp file then I think distinguishing between shutdown or log off is not of any consequence to you.

TheVillageIdiot
  • 40,053
  • 20
  • 133
  • 188
9

If you specifically need the log-off event, you can modify the code provided in TheVillageIdiot's answer as follows:

using Microsoft.Win32;

//during init of your application bind to this event   
SystemEvents.SessionEnding += 
    new SessionEndingEventHandler(SystemEvents_SessionEnding);

void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) 
{     
    if (e.Reason == SessionEndReasons.Logoff) 
    {  
        // insert your code here
    }
}
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
bjh
  • 138
  • 1
  • 3
0

If you have a Windows Form, you can handle the FormClosing event, then check the e.CloseReason enum value to determine if it equals to CloseReason.WindowsShutDown.

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.WindowsShutDown)
    {
        // Your code here
    }
}
riofly
  • 1,694
  • 3
  • 19
  • 40
  • 1
    Aren't "User log off" and "System shutdown" different things? – Uwe Keim Dec 08 '22 at 08:06
  • 1
    @UweKeim the CloseReason enum do not consider "User log off" scenario. https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.closereason?view=windowsdesktop-7.0 – riofly Dec 09 '22 at 09:48
0

You can use WMI and watch the Win32_ComputerShutdownEvent where Type is equal to 0. You can find more information about this event here, and more about using WMI in .NET here.

jrista
  • 32,447
  • 15
  • 90
  • 130