Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按escape键时如何关闭窗体?_C#_Winforms - Fatal编程技术网

C# 按escape键时如何关闭窗体?

C# 按escape键时如何关闭窗体?,c#,winforms,C#,Winforms,我有一个小表单,当我在Windows窗体应用程序中按下按钮时会出现 我希望能够通过按escape键关闭窗体。我怎么能这样做?我不确定要使用的事件。表单关闭?如果表单上有“取消”按钮,可以将form.CancelButton属性设置为该按钮,然后按escape将有效地“单击该按钮” 如果没有这样的按钮,请检查属性。如果表单上已有关闭表单的按钮,则可以在表单上设置属性来完成此操作 将窗体的属性设置为该按钮 获取或设置用户按Esc键时单击的按钮控件 如果没有取消按钮,则需要添加一个KeyDown处理程

我有一个小表单,当我在Windows窗体应用程序中按下按钮时会出现


我希望能够通过按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"