按钮可防止KeyDown事件触发,即使keypreview=true也是如此

本文关键字:true keypreview 即使 KeyDown 可防止 事件 按钮 | 更新日期: 2023-09-27 18:27:56

在VS Express 12:中复制的步骤

  • 创建新的Windows窗体应用程序项目
  • 添加按钮
  • 将Form 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事件将再次停止工作。设置关键点审查属性时,按钮为什么会发生干扰?

按钮可防止KeyDown事件触发,即使keypreview=true也是如此

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

您在keyDown上设置mUp。。。?你能添加所有相关的代码上下文吗,比如鼠标向上事件,你也可以尝试刷新,如果你打破了甚至在按下键时开火?

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

我在其他类似的帖子中看到,这可以帮助

this.focus();

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