我使用KeyDown事件和一些简单的代码如if (e.KeyCode == Keys.F1)
来捕获F1在表单上按下但是如果表单上有一些文本框,或者表格上有一些带有Dock Fill的电子表格,那么代码上面没用,什么也没做。但是当用户在此表单上按F1时,我想要做一些事情。那么我们如何在整个表单上捕获像F1这样的特定keydown事件。我不想去捕获表单上所有其他控件的KeyDown的路径,并将它们传递给Form进行处理。有什么更清洁的方法吗?
答案 0 :(得分:60)
是的,的确有。无论当前具有输入焦点的控件如何,表单处理键事件的正确方法是覆盖表单类的ProcessCmdKey
method:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.F1)
{
MessageBox.Show("You pressed the F1 key");
return true; // indicate that you handled this keystroke
}
// Call the base class
return base.ProcessCmdKey(ref msg, keyData);
}
您返回true
表示您已处理击键而不希望将其传递给其他控件。如果您执行希望将其传递给其他控件的事件处理程序,只需返回false
。
你最好忽略KeyPreview
property。这是VB 6天的时代错误,而不是在.NET世界中这样做的首选方式。进一步阅读:Disadvantage of setting Form.KeyPreview = true?
答案 1 :(得分:5)
将表单的KeyPreview
设置为true。这将确保表单首先获取按键消息,如果您处理它,您可以设置e.Handled = true
,以便它不会传递给控件。
答案 2 :(得分:4)
启用KeyPreview
,表单中的每次按键都将首先通过它的关键事件处理程序进行路由。
答案 3 :(得分:3)