如何检测Windows关机/注销并取消该操作(询问用户后)

一些解释:对于我正在处理的项目,我必须编写一个在后台运行的程序,检测对文件的更改,并将修改后的file upload到Web服务以使其他人可用。 非常简单的同步,如果它不是用户修改一个大文件,并决定在编辑后立即closures它的计算机的情况下。

我可以取消上传,并等待下一次重新启动上传,但我可以想象用户在第二天早上从networking上下载文件到另一台计算机,不明白为什么他昨天晚上的变化不存在。

所以我的想法是检测用户什么时候注销或者重新引导Windows,如果我正在上传,只是询问用户“我们还在同步刚才改变的文件Foo.txt 。你确定你想要重新启动?只有在重新启动计算机之后,您的更改才能被其他人使用!“ 如果用户说不,我需要取消重新启动/注销

这可能吗?

有一个名为SystemEvents的静态类,公开了这种行为:

http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx

但是,它不能区分某些操作,也不会暂停OS进程的超时警戒。 我曾经使用过它,但在注册表中配置的默认超时时间有点短,所以可能需要增加。

长话短说,这一切都感觉有点ha </s>。

要添加到@ Adam的答案,如果您需要告诉注销和关机/重新启动之间的区别,您可以处理WM_QUERYENDSESSION消息。

“ 关闭Windows Vista的更改 ”是一个有用的文章,了解关闭超时。

试图阻止关机现在是一个有损命题,在Vista和更高版本中不可能这样做。 提示不可读也不可访问。 使用服务在这里高度显示,让您在用户注销后生存下来。 而且重新启动后,您的服务将自动重新开始运行,让您完成这项工作。