protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (e.CloseReason == CloseReason.WindowsShutDown) return;
// Confirm user wants to close
switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo))
{
case DialogResult.No:
e.Cancel = true;
break;
default:
break;
}
}
能够处理 x 按钮单击事件非常有用的一种情况是,当您使用作为 MDI 容器的 Form 时。原因在于,闭幕式和闭幕式首先是与孩子一起举行,最后是与父母一起举行。因此,在一个场景中,用户单击 x 按钮关闭应用程序,MDI 父级请求继续进行确认。如果他决定不关闭应用程序,而是继续他正在做的事情,那么孩子们将已经处理了关闭事件,可能丢失了信息/工作。
一种解决方案是在主应用程序表单的 Windows 消息循环中拦截 WM _ CLOSE 消息(即关闭后终止应用程序) ,如下所示:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0010) // WM_CLOSE
{
// If we don't want to close this window
if (ShowConfirmation("Are you sure?") != DialogResult.Yes) return;
}
base.WndProc(ref m);
}