Detect whether a Windows reboot was due to Windows

2019-03-27 19:03发布

问题:

A few applications on my PC have been doing a detection wether a restart was done by Windows Update or not. This is observable due to them restarting after the automatic Windows Update reboot.

This is very helpful since those applications reload changes, even unsaved changes or restore tabs (in case of a browser). Examples of applications that do this:

  • Google Chrome
  • Microsoft Visual Studio
  • Microsoft Paint

In all cases the applications save the state they were in before the reboot.

(My PC actually woke up from a standby state automatically, and rebooted itself while instaling updates. Too bad it didnt go back to standby after doing this.)

My question is: How do I programmatically detect this kind of reboot? It seems to be reliably detectable before the reboot.

The question How can I get the Windows last reboot reason might seem like a duplicate, but no answer said anything about updates.

I code in C#, so an answer in C# would be helpful, though I can read C and C++ too, for example.

回答1:

See Application Restart:

An application can use Application Recovery and Restart (ARR) to save data and state information before the application exits due to an unhandled exception or when the application stops responding

and:

or if the computer needs to restart as the result of an update.

The applications aren't detecting the restart reason after the fact - they've been architected to use this API. There isn't (so far as I'm aware) a managed API for this.


A couple of clicks away is Saving data and application state when application is being closed due to a software update. Again, no managed API.



回答2:

Normally when Windows Reboots, it performs a restart by using shutdown.exe and the /g flag which saves the state of all registered running programs before restart. What you want to do is to Register your application for restart. There is a good sample with documentation for this by MSDN. It is available in C# and C++.