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

9
一些解释:我正在开发一个项目,需要编写一个后台程序,检测文件的更改,并上传修改后的文件到Web服务,以便让其他人使用。如果用户修改了大文件并在编辑后立即关闭计算机,这就是一个相当简单的同步问题。
我可以取消上传并等待下一次重启进行上传,但我可以想象第二天早上用户从Web下载文件到另一台计算机,却不理解为什么他昨晚的更改不在那里。
所以我的想法是,在用户注销或重新启动Windows时检测,如果我正在上传中,只需询问用户:“我们仍在同步您刚刚更改的文件Foo.txt。您确定要重新启动吗?直到您重新启动计算机,您的更改将无法提供给其他人!”。如果用户拒绝,我需要取消重启/注销。
这可行吗?
3个回答

10

有一个名为SystemEvents的静态类可提供此行为:

http://msdn.microsoft.com/zh-cn/library/microsoft.win32.systemevents.aspx

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

简而言之,这一切都感觉有点像黑客。


好的,这正是我想的...那我就放弃这种行为吧。我另外一个想法是在半透明窗口中始终显示上传进度。这样用户就会知道后台正在进行的工作,并且在这种情况下可能不会关闭。 - Sébastien Nussbaumer
@Sebastien 说实话,我会考虑像Hans建议的那样做一个服务。使上传变得强大,以便可以恢复,并将其全部包装在服务中,这样用户就不必手动重新启动它了。 - Adam Houldsworth
这大致是我要采取的行为,当我说“我会放弃这种行为”的时候。我只是想添加一个离散的上传进度条,以便让用户知道。如果提供了简历,则可能不需要此功能。我想我只是有点担心用户带着他的笔记本电脑和文件回家,而没有在系统中备份。 - Sébastien Nussbaumer

4

谢谢你的回复。我还没有来得及添加它(因为我要赶火车),但我的情况是区分关机和重启,以便在处理中止工作后恢复用户的操作。我不认为这两者是可以区分的。我也认为事件会给你一些关于操作的信息? - Adam Houldsworth
SystemEvents类无法告诉您发生了什么; WM_QUERYENDSESSION只能告诉您注销与关机或重启之间的区别。在Windows上,在系统关闭时无法区分关机和重启。 - Tim Robinson
啊,是的。昨晚我找到了我的旧代码,并发现我正在使用这个消息!幸运的是,这段代码只是为以前的老板提供概念证明,从未见过天日。 - Adam Houldsworth
我遇到了类似的问题,但我必须区分重新启动和关机。@TimRobinson,为什么没有提供这种区分的原因是什么?此外,微软为什么没有明确说明这一点(至少在我能够搜索到的范围内)? - warriorpostman

3

现在阻止关机已经变得不可行了,尤其是在Vista及以上版本中已经无法实现。弹出窗口也无法被读取和操作。在这里高度建议使用服务来完成任务,可以在用户注销或重启后继续运行,确保任务的完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接