【问题标题】:Pressing Esc is not firing KeyDown event [duplicate]按 Esc 不会触发 KeyDown 事件 [重复]
【发布时间】:2020-10-16 06:23:11
【问题描述】:

Esc 不会触发 KeyDown 事件。按 SpacebarF 会触发该事件,但 Esc 不会。

可能是什么原因?

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;
        }
    }

【问题讨论】:

  • 这段代码有什么意义?为什么代码调用其他控件的事件处理程序而不是方法?在任何情况下,ESC 键都有一个非常具体的工作 - 取消并关闭表单。提交它是Enter 的工作。此代码可能会导致最终用户表单代码本身的很多混淆
  • 我们不希望用鼠标单击关闭按钮,而是希望能够通过按 Esc 来关闭表单,这就是代码的重点。调用的事件处理程序方法正在执行案例需要的操作,因此我直接调用它们,但我应该将它们的内容定义为我知道的单独方法。
  • 如果您正确配置表单,您已经可以这样做了,因为Esc 是取消的按键,同样EnterOK 的按键
  • 还有How to: Designate a Windows Forms Button as the Accept Button Using the Designer,默认情况下将使用 ENTER 作为接受按钮。

标签: c# forms keydown


【解决方案1】:

有道理。在此处查看文档:https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.keydown?view=netcore-3.1

某些键,例如 TABRETURNESCarrow 键由控件自动处理。要让这些键引发 KeyDown 事件,您必须覆盖表单上每个控件中的 IsInputKey 方法。

    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Escape)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }

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

button1.PreviewKeyDown +=new PreviewKeyDownEventHandler(button1_PreviewKeyDown);
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Escape:
            e.IsInputKey = true;
            break;
    }
}

【讨论】:

  • TAB、RETURN、箭头键触发事件,但没有以编程方式将它们定义为 inputKey。
  • 根据文档,这看起来很奇怪。是否解决了 Escape 按钮的问题?
  • IsInputKey 和 PreviewKeyDown 两种方法都试过了,但是 Esc 都不行,很遗憾,谢谢推荐!我在另一篇文章中找到了 ProcessCmdKey 方法,但它也没有帮助。
  • 我想我会用“Q”来退出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多