4

我希望我的应用程序可以防止 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关闭,我将不胜感激。谢谢

4

3 回答 3

17

这是极不明智的建议,Microsoft 尽可能难以做到这一点。如果用户想要关闭,那么这是用户的责任,而不是应用程序。根据 Microsoft 文章Windows Vista 中的应用程序关闭更改

将不再允许静默关闭取消

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

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

...还...

应用程序不应阻止关机

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

如果您确实需要在关机期间进行干预,您应该注册一个新的 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 开始的模型。归根结底,范式是赋予用户控制权,并防止应用程序凌驾于用户需求之上。

于 2013-07-18T10:27:32.633 回答
-4
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.
    }
}
于 2014-07-19T16:51:56.297 回答
-4
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        MessageBox.Show("Cancelling Windows shutdown");
        e.Cancel = true;
    }
}
于 2013-07-18T10:20:21.257 回答