C#取消Windows关闭

本文关键字:关闭 Windows 取消 | 更新日期: 2023-09-27 18:23:40

我想我的应用程序可以防止从窗口关闭。我知道有一个系统命令可以做到这一点。但不要为我的程序工作。我用这个代码来"取消"关闭的窗口:

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.  
}

如果有人向我解释如何在"取消"窗口关闭,我将不胜感激。感谢

C#取消Windows关闭

这是非常不明智的,Microsoft尽可能地让它变得困难。如果用户想要关闭,那么这是用户的责任,而不是应用程序。根据微软的文章"Windows Vista中的应用程序关闭更改:"

将不再允许静默关闭取消

在Windows XP中,应用程序可以否决WM_QUERYENDESSION而不显示指示他们为什么需要取消关闭的任何UI。这些"无声关机失败"让用户非常沮丧,他们通常需要一两分钟才能意识到关闭失败,因为没有显示任何UI。

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

而且

应用程序不应阻止关闭

如果你从阅读这个话题中只带走一件事,那就是这个。如果您的应用程序不会阻止关闭。用户启动时在绝大多数情况下,他们都有强烈的愿望看到关闭成功;他们可能急于离开办公室比如周末。应用程序应尊重这一愿望如果可能的话,不会阻止关闭。

如果你真的需要在关机期间进行整合,有一个新的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以后的模型。最终,这种模式是赋予用户控制权,并防止应用程序凌驾于用户需求之上。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason.Equals(CloseReason.WindowsShutDown))
    {
        MessageBox.Show("Cancelling Windows shutdown");
        e.Cancel = true;
    }
}
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.
    }
}