我想我的应用程序可以防止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.
}
如果有人解释我怎么能在“取消”关闭窗口,我将不胜感激。 谢谢
答案 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.
}
}