C#取消Windows关机

时间:2013-07-18 10:12:32

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

我想我的应用程序可以防止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.  
}

如果有人解释我怎么能在“取消”关闭窗口,我将不胜感激。 谢谢

3 个答案:

答案 0 :(得分:13)

这是强烈建议,微软尽可能努力做到这一点。如果用户想要关闭,那么这是用户的责任,而不是应用程序。根据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开始探索模型。最终,范例是为用户提供控制,并防止应用程序覆盖用户需求。

答案 1 :(得分:-3)

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        MessageBox.Show("Cancelling Windows shutdown");
        e.Cancel = true;
    }
}

答案 2 :(得分:-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.
    }
}