题
禁用的最佳方法是什么 替代 + F4 在 C# win 表单中阻止用户关闭表单?
我使用表单作为弹出对话框来显示进度条,但我不希望用户能够关闭它。
解决方案
这完成了工作:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
编辑:为了回应 pix0rs 的担忧 - 是的,你是对的,你将无法以编程方式关闭应用程序。但是,您可以在关闭表单之前简单地删除 form_looking 事件的事件处理程序:
this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Close();
其他提示
如果你看一下 价值 的 FormClosingEventArgs e.CloseReason
, ,它会告诉您为什么表单被关闭。然后您可以决定要做什么,可能的值是:
成员名字 - 描述
没有任何 - 关闭原因未定义或无法确定。
Windows关机 - 操作系统在关闭之前正在关闭所有应用程序。
MdiForm关闭 - 此多文档界面 (MDI) 表单的父表单正在关闭。
用户关闭 - 用户通过用户界面 (UI) 关闭表单,例如通过单击表单窗口上的“关闭”按钮、从窗口的控制菜单中选择“关闭”或按 丙氨酸转氨酶+F4.
任务管理器关闭 - Microsoft Windows 任务管理器正在关闭该应用程序。
表单所有者关闭 - 业主表格即将关闭。
应用程序退出调用 - 调用Application类的Exit方法。
我相信这是正确的做法:
protected override void OnFormClosing(FormClosingEventArgs e)
{
switch (e.CloseReason)
{
case CloseReason.UserClosing:
e.Cancel = true;
break;
}
base.OnFormClosing(e);
}
请注意,应用程序完全阻止自身关闭被认为是不好的形式。您应该检查 Closing 事件的事件参数,以确定您的应用程序被要求关闭的方式和原因。如果是因为 Windows 关闭,则不应阻止关闭的发生。
你可以处理 FormClosing
事件和设置 FormClosingEventArgs.Cancel
到 true
.
我使用表单作为弹出对话框来显示进度条,但我不希望用户能够关闭它。
如果用户决定关闭您的应用程序(并且有足够的知识)来按 alt+f4,那么他们很可能也有足够的知识来运行任务管理器并终止您的应用程序。
至少使用 alt+f4 您的应用程序可以正常关闭,而不是仅仅让人们杀死它。根据经验,人们杀死你的应用程序意味着配置文件损坏、数据库损坏、无法恢复的半完成任务以及许多其他痛苦的事情。
至少用“你确定吗”来提示他们,而不是断然阻止。
这是一个需要禁用的黑客攻击 替代 + F4.
private void test_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4)
{
e.Cancel = true;
}
}
这完成了工作:
bool myButtonWasClicked = false;
private void Exit_Click(object sender, EventArgs e)
{
myButtonWasClicked = true;
Application.Exit();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (myButtonWasClicked)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
即使您以编程方式关闭窗口,FormClosing 也会被调用吗?如果是这样,您可能需要添加一些代码以允许表单在完成后关闭(而不是总是取消操作)
订阅表格关闭事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = e.CloseReason == CloseReason.UserClosing;
}
方法体中只有一行。
通过在表单的构造函数中使用以下内容隐藏表单上的关闭按钮:
this.ControlBox = false;