【问题标题】:C# - How to detect a Windows shutdown/logoff and cancel that action (after asking the user)C# - 如何检测 Windows 关机/注销并取消该操作(询问用户后)
【发布时间】:2011-06-04 18:57:32
【问题描述】:

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

我可以取消上传并等待下一次重新启动以进行上传,但我可以想象用户第二天早上将文件从网络下载到另一台计算机,并且不明白为什么他昨晚的更改不是'在那里。

所以我的想法是检测用户何时注销或重新启动 Windows,如果我正在上传,只需询问用户“我们仍在同步您刚刚更改的文件 Foo.txt。是您确定要重新启动吗?在您重新启动计算机之前,您所做的更改将无法提供给其他人使用!”。如果用户说不,我需要取消重启/注销

这可能吗?

【问题讨论】:

    标签: c# .net windows system-shutdown


    【解决方案1】:

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

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

    但是,它无法区分某些操作,也不会暂停操作系统进程超时保护。我用过一次,但是注册表中配置的默认超时时间有点短,所以可能需要增加。

    长话短说,感觉有点老套。

    【讨论】:

    • 好吧,我就是这么想的……那我就放弃这种行为。我的另一个想法是始终在半透明窗口中显示上传进度。然后让用户了解幕后正在进行的工作,并且在这种情况下可能不会关闭。
    • @Sebastien 老实说,我会考虑按照 Hans 的建议提供服务。使上传变得健壮,以便可以恢复,并将其全部包装在服务中,这样用户就不必手动重新启动它。
    • 当我说“我会放弃这种行为”时,我或多或少会采取这种行为。我只是想添加一个离散的上传进度只是为了让用户知道。当然,如果提供简历,则可能不需要。我想我只是对用户带着他的笔记本和未在系统中备份的文件回家的想法有点紧张......
    【解决方案2】:

    要补充@Adam 的答案,如果您需要区分注销和关闭/重启之间的区别,您可以处理WM_QUERYENDSESSION 消息。

    Shutdown Changes for Windows Vista”是了解关机超时的有用文章。

    【讨论】:

    • 谢谢。我还没有机会添加它(必须赶上我的火车),但我的情况告诉我关闭和重新启动之间的区别,以便我可以在处理中止工作后恢复用户的操作。我认为不可能区分这两者。我还认为这些事件可以为您提供一些有关行动的信息?
    • SystemEvents 类没有告诉你发生了什么; WM_QUERYENDSESSION 只能告诉您注销与关机或重新启动之间的区别。在 Windows 上,系统关闭时无法区分关机和重新启动。
    • 啊是的。昨晚我找到了我的旧代码,发现我正在使用这条消息!幸运的是,该代码是前任老板的概念验证,从未出现过。
    • 我遇到了类似的问题,除了我必须区分重启和关机。 @TimRobinson 没有提供这种区别的原因可能是什么?此外,微软没有明确说明这一点是否有原因(至少就我所能谷歌而言)。
    【解决方案3】:

    如今,试图阻止关机是一个有损的提议,在 Vista 及更高版本中不再可能这样做。提示既不可读也不可达。此处高度指示使用服务,让您在用户注销后幸存下来。重新启动后,您的服务将自动重新开始运行,让您完成工作。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多