C#取消Windows关机

我想我的应用程序可以防止从Windowsclosures。 我知道有一个系统命令来做到这一点。 但不适合我的程序。 我使用这个代码“取消”窗户closures:

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

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

这是非常不好的建议,微软要尽可能地做到这一点。 如果用户想要关闭,那么这是用户的责任,而不是应用程序。 根据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。

但是在一天结束的时候,所有这些工作都会向用户展示一个用户界面,告诉用户应用程序正在阻止关机并询问用户是否要继续并强制关机。 如果他们回答是的,你不能阻止这个,也没有办法阻止用户界面。

阅读我已经链接到的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. } } 

循环SHUTDOWN中止,在Windows 8上工作

 while (1==1) { Process process = new Process(); process.StartInfo.FileName = "shutdown.exe"; process.StartInfo.Arguments = "-a"; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.Start(); process.WaitForExit(); Thread.Sleep(2000); }