ham*_*iri 4 c# windows command-line system event-handling
我想我的应用程序可以防止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.
}
}
Run Code Online (Sandbox Code Playgroud)
并使用此代码,但不起作用:(:
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.
}
Run Code Online (Sandbox Code Playgroud)
如果有人解释我怎么能在"取消"关闭窗口,我将不胜感激.谢谢
Chr*_*s J 15
这是强烈建议,微软尽可能努力做到这一点.如果用户想要关闭,那么这是用户的责任,而不是应用程序.根据Microsoft文章Windows Vista中的应用程序关闭更改:
将不再允许取消静音
在Windows XP中,允许应用程序否决WM_QUERYENDSESSION,而不显示任何UI,指示他们需要取消关闭的原因.这些"静默关机故障"对用户来说非常令人沮丧,他们经常花一两分钟才意识到关机失败,因为没有显示UI.
即使应用程序否决了WM_QUERYENDSESSION,Windows Vista也会通过显示UI来消除这种可能性.
...也...
应用程序不应阻止关闭
如果你只阅读一个主题,那就应该是这个.如果您的应用程序没有阻止关闭,您将向用户展示最佳体验.当用户启动关机时,在绝大多数情况下,他们强烈希望看到关机成功; 例如,他们可能急于离开办公室去度周末.如果可能的话,应用程序应该通过不阻止关闭来满足这种需求.
如果你确实需要在关机期间进行干预,那么你应该注册一个新的API:
使用New Shutdown Reason API
新的关闭原因API包含三个功能:
Run Code Online (Sandbox Code Playgroud)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开始探索模型.最终,范例是为用户提供控制,并防止应用程序覆盖用户需求.