Windows系统更新
可能很多人都已经注意到了微软的Windows更新系统的新功能,它可以允许你延迟从新启动的操作,比如下图:
Figure:我们可以仅仅点击关闭,而过后再重启
Figure:Vista中的系统更新提示
Figure:Vista中的系统自动更新正在下载和安装更新包
这个功能让的我们的系统更新变得人性化,我们不用在受电脑的胁迫而去做我们不原意的重启了。
重启管理器的主要功能
但是,如果我们的更新更加智能化一下,可以自动的关闭我们正在运行的应用程序,并且在更新完成以后自动的启动它,那不是更好吗?重启管理器就是为了实现这样的功能而设计的。
先看一下我们如果使用了重启管理器会有怎样的效果。假设你在下班之前没有完成一个文档,把写了一半的文件留在了屏幕上;那么如果半夜里Word 2007需要进行更新,那么Vista系统就会调用重启管理器来通知Word 2007做安全关闭动作,当支持重启管理器的Word 2007收到安全关闭的消息的时候,它会自动将未完成的文档保存并关闭自己的所有窗口;当更新完成以后,重启管理器就会通知Word 2007启动并会协助其恢复原来的状态;不仅仅包括未完成的文档,还包括窗口的位置,光标的位置等所有和用户使用环境相关的内容。
同时,在我们设计更新程序的安装包的时候我们也可以调用重启管理器的API来向应用程序发出关闭和重启消息。
Figure:使用了重启管理器API的安装包会给出友好的提示
我们可以很明显的看到,重启管理器可以帮助我们提升用户在更新应用程序的过程中的体验,基本上用户的工作过程不会被更新程序打扰,而可以专注于自己正在处理的工作。
如何实现重启管理器的功能
Windows Vista系统已经内置了对重启管理器的支持,系统可以在安装更新包之前自动的向应用程序发出关闭消息,并在安装完成以后发出启动消息。我们的应用程序需要做的事情就是相应这些消息并作出争取的处理。
1.注册支持重启管理器
NativeMethods.RegisterApplicationRestart(
commandLineReturnValue, //用来唯一标识当前状态的主键
0);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
internal static extern uint RegisterApplicationRestart(string pszCommandline,int dwFlags);
上面所列的是c#代码实现的RegisterApplicationRestart API的调用,RegisterApplicationRetart是用来注册当前应用程序的系统API,调用之后,系统就知道这个应用程序会支持重启管理器的功能;在注册的同时我们还可以传送一个参数commandLineRetureValue,这个参数在后面会被重启管理器作为命令行参数返回给应用程序。
2.响应ENDSESSION_CLOSEAPP系统消息
//private const int ENDSESSION_LOGOFF = 0x8;