无论表单上的聚焦控制如何,我如何捕获Keys.F1?

时间:2011-05-10 14:19:53

标签: c# .net winforms keydown keyevent

我使用KeyDown事件和一些简单的代码如if (e.KeyCode == Keys.F1)来捕获F1在表单上按下但是如果表单上有一些文本框,或者表格上有一些带有Dock Fill的电子表格,那么代码上面没用,什么也没做。但是当用户在此表单上按F1时,我想要做一些事情。那么我们如何在整个表单上捕获像F1这样的特定keydown事件。我不想去捕获表单上所有其他控件的KeyDown的路径,并将它们传递给Form进行处理。有什么更清洁的方法吗?

4 个答案:

答案 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)