gpt4 book ai didi

c# - 即使 keypreview = true,按钮也会阻止 KeyDown 事件触发

转载 作者:行者123 更新时间:2023-11-30 17:03:44 26 4
gpt4 key购买 nike

在 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 属性时按钮会干扰?

最佳答案

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

关于c# - 即使 keypreview = true,按钮也会阻止 KeyDown 事件触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18280976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com