退出按钮以在C#中关闭Windows窗体表单

yea*_*mok 87 c# winforms

我尝试过以下方法:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

然后我尝试了这个:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}
Run Code Online (Sandbox Code Playgroud)

仍然没有任何工作.

我的Windows窗体表单属性上的KeyPreview设置为true ...我做错了什么?

Han*_*ant 195

无论正确的事件处理程序分配,KeyPreview,CancelButton等如何,这都将始终有效:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Close();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
Run Code Online (Sandbox Code Playgroud)

  • 呃,20世纪80年代打电话,他们希望他们的对话框回来. (13认同)
  • -1,使用Form的CancelButton属性是正确的方法. (9认同)
  • 如果表单上有实际的Button(或IButtonControl接口对象),则只能使用表单的CancelButton属性. (7认同)
  • 这个选项不错。CancelButton 需要额外的 **visible** 'Cancel' 按钮在表单上。这是多余的渲染 + 代码 + 等 (3认同)
  • 是什么使它成为优于 CancelButton 属性的首选方法? (2认同)

Sha*_*ard 60

您应该只能将Form的CancelButton属性设置为Cancel按钮,然后您将不需要任何代码.

  • 我这样做但是当我按下esc时它没有被解雇,为什么? (2认同)

Ada*_*son 15

假设您有一个"取消"按钮,设置表单的CancelButton属性(在设计器或代码中)应该自动处理.只需Click在按钮出现时关闭代码即可.


Joe*_*oel 7

接受的答案确实是正确的,我已经多次使用过这种方法.突然间,它不再起作用,所以我发现它很奇怪.主要是因为我的断点不会被ESC键击中,但它会击中其他键.

调试后我发现我的表单中的一个控件是覆盖ProcessCmdKey方法,使用以下代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
Run Code Online (Sandbox Code Playgroud)

......这阻止了我的表格获得ESC密钥(请注意return true).因此,请确保没有子控件接管您的输入.