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

C#-如何检测Windows关闭/注销并取消该操作(询问用户后),c#,.net,windows,system-shutdown,C#,.net,Windows,System Shutdown,一些解释:对于我正在进行的项目,我必须编写一个在后台运行的程序,检测对文件的更改,并将修改后的文件上载到web服务,以便其他人可以使用。如果不是用户修改一个大文件并决定在编辑后立即关闭计算机,那么同步就相当简单了 我可以取消上传,等待下一次重新启动来进行上传,但我可以想象用户第二天早上将文件从网络下载到另一台计算机上,却不明白为什么昨晚的更改没有出现 我的想法是检测用户何时注销或重新启动Windows,如果我在上传的过程中,只要求用户“我们仍然同步文件 fo.txt>代码>你刚刚改变了。你确定要

一些解释:对于我正在进行的项目,我必须编写一个在后台运行的程序,检测对文件的更改,并将修改后的文件上载到web服务,以便其他人可以使用。如果不是用户修改一个大文件并决定在编辑后立即关闭计算机,那么同步就相当简单了

我可以取消上传,等待下一次重新启动来进行上传,但我可以想象用户第二天早上将文件从网络下载到另一台计算机上,却不明白为什么昨晚的更改没有出现

我的想法是检测用户何时注销或重新启动Windows,如果我在上传的过程中,只要求用户“我们仍然同步文件<代码> fo.txt>代码>你刚刚改变了。你确定要重新启动吗?你的改变在别人重新启动你的计算机之前是不可用的!”如果用户说不,我需要取消重新启动/注销


这是可能的吗?

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

但是,它无法区分某些操作,并且不会暂停操作系统进程超时保护。我曾经使用过它,但是注册表中配置的默认超时时间有点短,因此可能需要增加


长话短说,这一切都让人觉得有点不妥。

要补充@Adam的答案,如果你需要区分注销和关闭/重新启动,你可以处理这个消息


“”是一篇了解关机超时的有用文章。

现在试图阻止关机是一个有损的建议,在Vista及更高版本中不再可能这样做。提示既不可读也不可访问。这里高度指出使用服务,让您能够在用户注销后生存下来。重新启动后,您的服务将自动重新开始运行,让您完成任务。

谢谢。我还没有机会添加它(必须赶火车),但我的情况告诉我关机和重启之间的区别,这样我可以在处理完中止工作后恢复用户的操作。我认为不可能区分这两者。我还认为这些事件为您提供了一些关于操作的信息。
SystemEvents
类不会告诉您发生了什么
WM_QUERYENDSESSION
只能告诉您注销与关机或重新启动之间的区别。在Windows上,当系统关闭时,无法区分断电和重新启动。啊,是的。我昨晚找到了我的旧代码,发现我正在使用此消息!幸运的是,这段代码对以前的一位老板来说是一个概念证明,而且从来没有看到过曙光。我有一个类似的问题,只是我必须区分重启和关机@TimRobinson没有提供这种区别的原因可能是什么?还有,微软没有明确说明这一点有什么原因吗(至少在我能用谷歌搜索到的范围内是这样的)。。。那我就不干这种事了。我的另一个想法是在半透明的窗口中随时显示上传进度。然后让用户知道幕后正在进行的工作,在这种情况下可能不会关机。@Sebastien说实话,我会按照Hans的建议做服务。让上传变得健壮,这样它就可以恢复,并将其全部打包到一个服务中,这样用户就不必手动重新启动它。这或多或少是我在说“我会放弃这种行为”时要采取的行为。我只是想添加一个离散的上传进度,让用户知道。如果提供了简历,则可能不需要这样做。我想我只是有点担心一个用户带着他的笔记本和没有备份到系统中的文件回家。。。