Jan*_*ond 27 c# shutdown winforms
我有一个Windows窗体应用程序,当主窗口关闭时,它会显示一个基本对话框,确认操作.如果用户决定取消应用程序,则取消退出.
但是,当应用程序最小化并且用户想要关闭PC时,关闭序列将停止,因为我的应用程序正在等待用户确认应用程序关闭(显示对话框).
我想添加一个用于超时的计时器,如果在一定时间内没有答案,请自动关闭应用程序,但即使这是一种方法,它肯定不是每个其他应用程序如何做到的.
那么,除非系统正在关闭,否则在其他情况下确定应用程序关闭的最佳解决方案是什么?
谢谢!
Joh*_*mer 48
在FormClosing事件中,检查FormClosingEventArgs的CloseReason属性以查看窗口关闭的原因.如果是CloseReason.WindowsShutDown
,则不显示您的对话框,也不要取消关闭表单.
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
// Verify that we're not being closed because windows is shutting down.
if (e.CloseReason != CloseReason.WindowsShutDown)
{
// Show your dialog / cancel closing.
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您可能还希望包含,CloseReason.TaskManagerClosing
因为用户显然希望在该方案中关闭您的应用程序,并且任务管理员已经要求确认.或者只显示您的对话框CloseReason.UserClosing
.
在Closing事件处理程序中,您可以像这样定义:
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
Run Code Online (Sandbox Code Playgroud)
并且我猜你发布了确认对话框,你可以检查CloseReason参数,如果它是导致它的关闭,则不发布对话框:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.WindowsShutDown)
{
//do not show the dialog
}
}
Run Code Online (Sandbox Code Playgroud)
SystemEvents可以帮助您.当用户尝试注销或关闭系统时,会发生SessionEnding.
Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();
Run Code Online (Sandbox Code Playgroud)