基本上,我有一个带有自定义控件的表单(仅此而已)。自定义控件完全为空,并且表单的 KeyPreview 设置为 true。
使用此设置,我没有收到任何箭头键或 Tab 的任何 KeyDown 事件。我键盘上的所有其他键都可以使用。我将 KeyDown 事件处理程序连接到具有此类事件的所有内容,因此我确信我没有遗漏任何内容。
另外值得注意的是,如果我删除(完全空的)自定义控件,我会得到箭头键事件。
这到底是怎么回事?
编辑:
我将此添加到表单和控件中,但我仍然没有得到箭头键:
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x100: //WM_KEYDOWN
//this is the control's version. In the form, it's this.Text
ParentForm.Text = ((Keys)m.WParam).ToString();
break;
}
base.WndProc(ref m);
}
我还检查了 Spy++,并确定表单本身没有收到任何 WM_KEYDOWN 消息,它们都将进入控件。但是,也就是说,控件正在获取箭头键 WM_KEYDOWN 消息。叹。
编辑 2:我还用这个版本更新了 ZIP 文件。请看一下,如果你想帮助...
编辑3:
我已经想通了,有点。该形式正在吃箭头键,可能是为了保持其孩子的注意力。事实证明,如果表单为空,我确实会收到事件。
无论如何,如果我将此代码添加到表单中,我会再次开始获取事件:
public override bool PreProcessMessage(ref Message msg) {
switch (msg.Msg) {
case 0x100: //WM_KEYDOWN
return false;
}
return base.PreProcessMessage(ref msg);
}
当我覆盖它时,表单没有机会做它的脏活,所以我得到了我期望的 KeyDown 事件。我假设这样做的副作用是我不能再使用我的键盘来导航表单(在这种情况下没什么大不了的,因为它是一个游戏,这个练习的全部目的是实现键盘导航!)
如果有办法,如何“正确”禁用这个问题仍然存在......