按钮可防止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事件将再次停止工作。设置关键点审查属性时,按钮为什么会发生干扰?
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();
试试看,让我知道继续寻找其他方法