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.
}
如果有人向我解释如何在"取消"窗口关闭,我将不胜感激。感谢
这是非常不明智的,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.
}
}