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

Boh*_*ohn 29 .net c# keyevent keydown winforms

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

Cod*_*ray 60

是的,的确有.无论当前具有输入焦点的控件如何,表单处理键事件的正确方法是覆盖表单类的ProcessCmdKey方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

您返回true表示您已处理击键并且希望将其传递给其他控件.如果您确实希望将其传递给其他控件的事件处理程序,只需返回即可false.

而你最好忽略这个KeyPreview属性.这是VB 6天的时代错误,而不是在.NET世界中这样做的首选方式.进一步阅读:设置Form.KeyPreview = true的缺点?

  • 怎么不是首选方式?`KeyPreview`使用.NET的以事件为中心的架构,而你只是覆盖了`WndProc`,这是首选的Win3.1(是的,这是正确的,1992技术). (5认同)

Bal*_*a R 5

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