【问题标题】:Button prevents KeyDown event from triggering even with keypreview = true即使使用 keypreview = true,按钮也会阻止触发 KeyDown 事件
【发布时间】:2013-08-19 07:29:45
【问题描述】:

在 VS Express 12 中重现的步骤:

  • 创建一个新的 Windows 窗体应用程序项目
  • 添加按钮
  • 将表单 KeyPreview 设置为 true
  • 向表单添加 keyDown 事件
  • 只要表单上存在按钮,该事件就不会触发

我有一个项目,我想同时捕获 keydown 和 keyup 事件,但是,我似乎只能让 keyup 事件工作。

我有一个带有单个面板、按钮和标签的表单。在表单中,keyPreview 属性设置为 true,并链接到 KeyDown 和 KeyUp 事件。 但是,当我运行程序时,只会触发 KeyUp 事件。

我尝试通过添加手动添加事件处理程序

this.KeyPreview = true;
this.KeyDown += new KeyEventHandler(Form1_KeyDown);

但还是不行。

有什么建议吗?

KeyUp 事件:

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        TriggerKey(e.KeyCode, false);
    }

    private void TriggerKey(Keys e, Boolean pKeyDown)
    {
        switch (e)
        {
            case Keys.Left:
                mLeft = pKeyDown;
                break;

            case Keys.Right:
                mRight = pKeyDown;
                break;

            case Keys.Down:
                mDown = pKeyDown;
                break;

            case Keys.Up:
                mUp = pKeyDown;
                break;
        }
    }

我的 Form1_KeyDown 事件如下所示:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    TriggerKey(e.KeyCode, true);
}

编辑2: 我尝试从表单中删除按钮,然后两个事件都正确触发。如果我重新添加它,keyDown 事件将再次停止工作。为什么设置 keypreview 属性时按钮会干扰?

【问题讨论】:

  • 您的控件有焦点吗?尝试单击表单的空白区域并按下一个键
  • 这是 Windows 窗体还是 WPF? C# 没有 KeyDown 事件。
  • 我也试过了,但如果焦点是问题,KeyPreview 是否应该修复它并且不应该触发 keyUp?
  • @JohnSaunders 这是 Windows 窗体。对不起,如果我有点不清楚。是这个问题吗?
  • 更新了 keyup 事件以使其有意义,因为很多人都在评论它

标签: c# winforms keyboard-events


【解决方案1】:

KeyPreview 是一个 VB6 兼容性功能,它不是“原生”Winforms。它有一个与您的问题完全匹配的问题。在查看 KeyPreview 的代码有机会运行并触发 KeyDown 事件之前,还有其他 Form 方法会首先嗅探击键。他们首先吃导航键。就像您尝试查看的光标键以及 Tab 键一样。这符合 VB6 的行为,它也看不到光标键。

要领先于该代码,您需要覆盖表单的 ProcessDialogKey() 方法。像这样:

    protected override bool ProcessDialogKey(Keys keyData) {
        switch (keyData) {
            case Keys.Left:
                //...
                return true;
        }
        return base.ProcessDialogKey(keyData);
    }

【讨论】:

  • 完美运行,感谢您的详细说明!在这种情况下,所有键都是如此,而不仅仅是方向键。这是否被视为已知错误?
  • 这不是错误,完全是设计使然。
  • 我会说This is not a bug, it's a feature :)
【解决方案2】:

您在 keyDown 上设置 mUp...?你能添加所有相关的代码上下文,比如鼠标向上事件,你也可以尝试刷新,如果你打破了即使在按键按下时也会触发?

【讨论】:

  • 除了KeyUp和KeyDown之外没有其他事件,我现在添加了KeyUp事件代码。你还想让我添加其他代码吗?
  • 欢迎来到 SO,@BunnyStrider。将来,像你这样的帖子更适合作为评论,而不是作为答案。
【解决方案3】:

请注意,keyup 是在 keydown 之后引发的(如果您希望 mUp 保持为真)

【讨论】:

  • 修复它现在有意义。但是 KeyDown 事件仍然没有触发。
  • 但按向上键后会为假。你怎么知道这个事件不起作用
  • 断点,当我从表单中删除按钮时,它可以正常工作。
  • 如果您阅读我的问题,您会发现我已经设置了该属性。感谢您的努力
【解决方案4】:

我在其他类似的帖子中看到这可能会有所帮助

this.focus();

试一试,让我知道继续寻找其他方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多