winforms 如何使窗体在按Esc键时关闭?

slsn1g29  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(293)

我有一个小窗体,当我在Windows窗体应用程序中按下按钮时,它会出现。
我希望能够通过按escape键来关闭窗体。我该怎么做呢?我不确定要使用的事件。form_closing?

weylhg0b

weylhg0b1#

如果窗体上已经有一个关闭窗体的按钮,则可以设置窗体上的属性来执行此操作。
将窗体的CancelButton属性设置为该按钮。
获取或设置用户按Esc键时单击的按钮控件。
如果你没有取消按钮,那么你需要添加一个KeyDown处理程序,并检查其中的Esc键:

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        this.Close();
    }
}

您还必须将KeyPreview属性设置为true。
获取或设置一个值,该值指示窗体是否将在键事件传递给具有焦点的控件之前接收该事件。
然而,正如Gargo在他的answer中指出的,这意味着按Esc键中止对对话框中控件的编辑也会有关闭对话框的效果。为了避免这种情况,请重写ProcessDialogKey方法,如下所示:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}
5ktev3wc

5ktev3wc2#

我发现最好的方法是重写“ProcessDialogKey”函数。这种方法取消打开的控件仍然是可能的,因为只有当没有其他控件使用按下的键时才会调用该函数。
这与设置CancelButton属性的行为相同。使用KeyDown事件总是会触发,因此即使窗体应该取消对打开的编辑器的编辑,窗体也会关闭。

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}
vwhgwdsa

vwhgwdsa3#

如果窗体上有“取消”按钮,则可以将Form.CancelButton属性设置为该按钮,然后按Esc键将有效地“单击该按钮”。
如果没有这样的按钮,请查看Form.KeyPreview属性。

ki1q1bka

ki1q1bka4#

Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;
z9gpfhce

z9gpfhce5#

将此代码粘贴到窗体的“按下键时”属性中,同时确保将“键预览”属性设置为“是”。

If KeyCode = vbKeyEscape Then DoCmd.Close acForm, "YOUR FORM NAME"
nbnkbykc

nbnkbykc6#

Windows窗体实际上有一个属性,专门用于已经有一个取消按钮,但希望补充Esc键功能的情况。

this.CancelButton = yourButton_button;

该属性如其文档中所述:
窗体的“取消”按钮。如果设置了此属性,则每当用户按“ESC”键时,该按钮都会被“单击”。
可能值得注意的是,还有this.AcceptButton用于“Enter”键。

相关问题