【发布时间】: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