在VS Express 12中重现步骤:
- 创建一个新的Windows Forms应用程序项目
- 添加一个按钮
- 将表单的KeyPreview属性设置为true
- 为表单添加一个keyDown事件
- 只要按钮存在于表单上,该事件就不会触发
我有一个项目,我想捕获按键按下和松开事件,但是似乎只能让松开事件起作用。
我有一个表单,上面有一个单独的面板、按钮和标签。在表单中,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属性被设置时,为什么按钮会干扰呢?