C# 按escape键时如何关闭窗体?
我有一个小表单,当我在Windows窗体应用程序中按下按钮时会出现C# 按escape键时如何关闭窗体?,c#,winforms,C#,Winforms,我有一个小表单,当我在Windows窗体应用程序中按下按钮时会出现 我希望能够通过按escape键关闭窗体。我怎么能这样做?我不确定要使用的事件。表单关闭?如果表单上有“取消”按钮,可以将form.CancelButton属性设置为该按钮,然后按escape将有效地“单击该按钮” 如果没有这样的按钮,请检查属性。如果表单上已有关闭表单的按钮,则可以在表单上设置属性来完成此操作 将窗体的属性设置为该按钮 获取或设置用户按Esc键时单击的按钮控件 如果没有取消按钮,则需要添加一个KeyDown处理程
我希望能够通过按escape键关闭窗体。我怎么能这样做?我不确定要使用的事件。表单关闭?如果表单上有“取消”按钮,可以将form.CancelButton属性设置为该按钮,然后按escape将有效地“单击该按钮”
如果没有这样的按钮,请检查属性。如果表单上已有关闭表单的按钮,则可以在表单上设置属性来完成此操作 将窗体的属性设置为该按钮 获取或设置用户按Esc键时单击的按钮控件 如果没有取消按钮,则需要添加一个
KeyDown
处理程序,并在其中检查Esc键:
private void Form_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
您还必须将属性设置为true
获取或设置一个值,该值指示窗体在将事件传递给具有焦点的控件之前是否接收键事件
然而,正如Gargo在他的文章中指出的,这意味着按Esc键中止对对话框中控件的编辑也会产生关闭对话框的效果。要避免这种情况,请按如下方式重写ProcessDialogKey
方法:
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
我发现最好的方法是重写“ProcessDialogKey”函数。这种方法仍然可以取消打开的控件,因为只有在没有其他控件使用按下的键时才会调用该函数 这与设置取消按钮时的行为相同。使用KeyDown事件将始终激发,因此即使表单应该取消对打开编辑器的编辑,表单也会关闭
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
将此代码粘贴到表单的“按下键”属性中,同时确保将“键预览”属性设置为“是”
关于替代解决方案,请参见Hans Passant关于此主题的回答:这是否回答了您的问题?遗憾的是,简单地添加一个隐藏按钮(visible=true)从处理的角度来看是行不通的,为此添加一个隐藏按钮将是一个非常糟糕的解决方案,因为在任何一种情况下,表单内部都会有一个键侦听器使其发挥作用。无需创建不必要的button对象,只需调用链接到其单击的侦听器的函数即可。@SergeWautier您是对的,但kkkppps answer是解决此问题的方法表单的CancelButton属性无法调用FormClosing事件的原因是什么,或者类似的方法?我也发现这种方法是最好的方法,因为如果当前表单是子对话框表单,使用诸如设置表单的“取消”按钮之类的解决方案,将向父表单发送关键事件,但是这个解决方案是通过在表单关闭后返回true时完成关键过程来保护错误。这个答案应该是正确的。按钮是隐藏的,但“可见”属性不是“假”,这样它就像一个符咒。很不错的!我不知道。。看起来很“黑”。。就像回到vb6时代。这是VBA代码。问题是关于c#和winforms。
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
If KeyCode = vbKeyEscape Then DoCmd.Close acForm, "YOUR FORM NAME"