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

问题描述 投票:28回答:4

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

c# .net winforms keydown keyevent
4个回答
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?


5
投票

将表单的KeyPreview设置为true。这将确保表单首先获取按键消息,如果您处理它,您可以设置e.Handled = true,以便它不会传递给控件。


4
投票

打开KeyPreview,表单中的每个按键将首先通过它的关键事件处理程序进行路由。


© www.soinside.com 2019 - 2024. All rights reserved.