如何禁用Alt + F4closures窗体?
在ac#win表格中禁用Alt + F4以防止用户closures表单的最佳方法是什么?
我正在使用窗体作为popup对话框来显示进度栏,我不希望用户能够closures它。
这样做的工作:
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; }
编辑:为了响应pix0rs的关注 – 是的,你是正确的,你将无法编程closures应用程序。 但是,您可以在closures表单之前简单地移除form_closing事件的事件处理程序:
this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.Close();
@TK
如果您查看FormClosingEventArgs e.CloseReason
的值,它会告诉您为什么表单正在closures。 然后您可以决定要做什么,可能的值是:
成员名称 – 说明
无 – closures的原因没有定义或无法确定。
WindowsShutDown – 操作系统在closures之前closures所有应用程序。
MdiFormClosing – 此多个文档界面(MDI)窗体的父窗体正在closures。
用户closures – 用户通过用户界面(UI)closures表单,例如通过单击表单窗口上的closuresbutton,从窗口的控制菜单中selectclosures,或者按下ALT + F4键。
TaskManagerClosing – Microsoft Windows任务pipe理器正在closures应用程序。
FormOwnerClosing – 所有者窗体正在closures。
ApplicationExitCall – 调用Application类的Exit方法。
我相信这是正确的做法:
protected override void OnFormClosing(FormClosingEventArgs e) { switch (e.CloseReason) { case CloseReason.UserClosing: e.Cancel = true; break; } base.OnFormClosing(e); }
请注意,对于应用程序来说,完全阻止其自动closures被认为是不正确的forms。 您应该检查closures事件的事件参数,以确定如何以及为什么您的应用程序被要求closures。 如果是因为Windows关机,则不应阻止closures发生。
您可以处理FormClosing
事件并将FormClosingEventArgs.Cancel
设置为true
。
我正在使用窗体作为popup对话框来显示进度栏,我不希望用户能够closures它。
如果用户决定closures你的应用程序(和知识)足以按alt + f4,他们很可能也是足够的知识运行任务pipe理器,并杀死你的应用程序。
至less在alt + f4中,你的应用程序可以做一个优雅的关机,而不是让人们杀死它。 根据经验,人们杀死你的应用程序意味着损坏的configuration文件,破损的数据库,你不能恢复的一半完成的任务,以及许多其他痛苦的事情。
至less用“你确定”来提示他们,而不是把他们阻止。
即使在编程closures窗口时,FormClosing会被调用吗? 如果是这样的话,你可能想要添加一些代码来让表单在你完成时closures(而不是总是取消操作)
订阅FormClosing事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = e.CloseReason == CloseReason.UserClosing; }
方法体中只有一行。
在FormClosing事件处理程序中,如果按下了[Alt] + [F4]键,您是否可以不询问键盘缓冲区(您是否可以访问此键)?如果为true,则继续;否则继续?
这对我来说是100%,这是为了禁用ALT + F4
private void test_FormClosing(object sender, FormClosingEventArgs e) { if (test.ModifierKeys == Keys.Alt || test.ModifierKeys == Keys.F4) { e.Cancel = true; } }
通过在窗体的构造函数中使用以下隐藏窗体上的closuresbutton:
this.ControlBox = false;