如何捕获 Keys.F1,而不考虑窗体上的焦点控件

本文关键字:窗体 焦点 控件 不考虑 何捕获 Keys F1 | 更新日期: 2023-09-27 17:55:43

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

如何捕获 Keys.F1,而不考虑窗体上的焦点控件

是的,确实有。无论当前具有输入焦点的控件如何,窗体处理键事件的正确方法是重写窗体类的 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);
}

返回 true 以指示您处理了击键,并且不希望将其传递给其他控件。如果确实希望将其传递给其他控件的事件处理程序,只需返回 false

而且您最好忽略KeyPreview属性。这是 VB 6 天的一个时代错误,并不是 .NET 世界中执行此操作的首选方法。延伸阅读:设置 Form.KeyPreview = true 的缺点?

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

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

另一种方法是覆盖 ProcessCmdKey 函数 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx