C# 按Esc键不是触发按键关闭事件

C# 按Esc键不是触发按键关闭事件,c#,forms,keydown,C#,Forms,Keydown,按Esc键不会触发向下键事件。按空格键或F键触发事件,但不触发 原因可能是什么 在以下示例中,KeyPreview设置为True: private void form_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Space: btnCreate_Click(null, null); break;

按Esc键不会触发
向下键
事件。按空格键或F键触发事件,但不触发

原因可能是什么

在以下示例中,
KeyPreview
设置为
True

    private void form_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Space:
                btnCreate_Click(null, null); break;
            case Keys.F:
                switchThrow(); break;
            case Keys.Escape:
                form_FormClosing(null, null); break;
        }
    }

有道理。检查此处的文档:

某些键(如TAB键、RETURN键、ESC键和
箭头键)由控件自动处理。要使这些键引发KeyDown事件,必须覆盖窗体上每个控件中的
IsInputKey
方法

您可以处理
PreviewKeyDown
事件并将
IsInputKey
属性设置为true,而不是重写
IsInputKey
方法。有关代码示例,请参见PreviewKeyDown事件


这段代码的意义是什么?为什么代码调用其他控件的事件处理程序而不是方法?在任何情况下,
ESC
键都有一个非常特定的作业-取消并关闭表单。提交它是
Enter
的工作。这段代码会给最终用户和表单代码本身带来很多混乱,而不是用鼠标点击关闭按钮,我们只想通过按Esc键来关闭表单,这就是代码的要点。被调用的事件处理程序方法正在执行案例所需的操作,因此我直接调用了它们,但我应该将它们的内容定义为我知道的一个单独的方法。如果正确配置表单,您已经可以这样做了,因为
Esc
是Cancel的击键,
Enter
的方式与
OK
Check的击键方式相同,默认情况下,它将使用Enter作为Accept按钮。TAB、RETURN、箭头键在启动事件时没有以编程方式将其定义为inputKey。根据文档,这似乎很奇怪。它解决了Escape按钮的问题吗?我尝试了IsInputKey和PreviewKeyDown两种方法,但对Esc不起作用,不幸的是,感谢您的推荐!我在另一篇文章中找到了ProcessCmdKey方法,但也没用。我想我会用“Q”来表示退出
    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Escape)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }
button1.PreviewKeyDown +=new PreviewKeyDownEventHandler(button1_PreviewKeyDown);
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Escape:
            e.IsInputKey = true;
            break;
    }
}