【问题标题】:C# Cancel Windows ShutdownC# 取消 Windows 关机
【发布时间】:2013-07-17 05:36:42
【问题描述】:

我希望我的应用程序可以防止 Windows 关闭。我知道有一个系统命令可以做到这一点。但不要为我的程序工作。 我使用此代码“取消”关闭窗口:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        MessageBox.Show("Cancelling Windows shutdown");
        string cmd = "shutdown /a";
        Process.Start(cmd);// for executing system command.
    }
}

也使用此代码,但不起作用:( :

public Form1()
{
    InitializeComponent();

    SystemEvents.SessionEnding += SessionEndingEvtHandler;
}

private void SessionEndingEvtHandler(object sender, SessionEndingEventArgs e)
{
    MessageBox.Show("Cancelling Windows shutdown");
    string cmd = "shutdown /a";
    Process.Start(cmd);// for executing system command.  
}

如果有人向我解释如何“取消”Windows 关闭,我将不胜感激。 谢谢

【问题讨论】:

  • 在现代版本的 Windows 中,应用程序不允许这样做,IIRC
  • Vista 中引入的更改如下所述:msdn.microsoft.com/en-us/library/ms700677.aspx 即使应用程序阻止关闭,用户也可以覆盖并强制关闭。
  • shutdown /a 仅取消关闭前的超时时间(例如,如果您已使用 shutdown /t 30 启动系统关闭)。一旦关闭过程本身开始,就无法停止。
  • 这已经结束了,太多的程序做了你想做的事。你有几秒钟的时间来保存基本状态,你最好快点实施。

标签: c# windows command-line event-handling system


【解决方案1】:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        MessageBox.Show("Cancelling Windows shutdown");
        e.Cancel = true;
    }
}

【讨论】:

    【解决方案2】:

    这是非常不明智的建议,Microsoft 尽可能难以做到这一点。如果用户想要关闭,那么这是用户的责任,而不是应用程序。根据微软文章Application Shutdown Changes in Windows Vista

    将不再允许静默关闭取消

    在 Windows XP 中,允许应用程序否决 WM_QUERYENDSESSION 不显示任何 UI 指示他们为什么需要取消关机。 这些“静默关机失败”让用户非常沮丧,他们 通常需要一两分钟才能意识到关机失败,因为 没有显示任何 UI。

    Windows Vista 将通过显示 UI 来消除这种可能性,即使 应用程序否决 WM_QUERYENDSESSION。

    ...还有...

    应用程序不应阻止关机

    如果您在阅读本主题时只需要做一件事情,那应该是 这个。如果满足以下条件,您将为用户提供最佳体验 您的应用程序不会阻止关机。当用户发起 关闭,在绝大多数情况下,他们有强烈的愿望 看到关机成功;他们可能急于离开办公室 以周末为例。应用程序应该尊重这种愿望 尽可能不阻止关机。

    如果您确实需要在关机期间进行干预,您应该注册一个新的 API:

    使用新的关闭原因 API

    新的关机原因 API 包含三个函数:

    BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason);
    BOOL ShutdownBlockReasonDestroy(HWND hWnd);
    BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff);
    

    同样,Windows Vista 应用程序在关机时的最佳做法是 他们不应该阻止关机。但是,如果您的应用程序 必须阻止关机,Microsoft 建议您使用此 API。

    但归根结底,所有这一切都会向用户呈现一个用户界面,告诉用户应用程序正在阻止关闭,并询问用户是否要继续并强制关闭。如果他们回答是,则您无法阻止此操作,也无法阻止 UI。

    阅读我链接到的 MSDN 文章 - 它解释了从 Vista 开始的模型。归根结底,范式是赋予用户控制权,并防止应用程序凌驾于用户需求之上。

    【讨论】:

      【解决方案3】:
      private void Form1_FormClosing(object sender, FormClosingEventArgs e)
      {
          if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
          {
              MessageBox.Show("Cancelling Windows shutdown");
              Process.Start("cmd.exe", "shutdown /a");// for executing system command.
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多