如何捕获 Keys.F1,而不考虑窗体上的焦点控件
本文关键字:窗体 焦点 控件 不考虑 何捕获 Keys F1 | 更新日期: 2023-09-27 17:55:43
>我使用了KeyDown事件和一些简单的代码,例如if (e.KeyCode == Keys.F1)
来捕获F1,则在表单上按下但是如果表单上有一些文本框,或者如果表单上有一些带有Dock Fill的电子表格,那么上面的代码将变得无用并且什么也不做。但是当用户在此表单上按 F1 时,我想做点什么。那么我们如何在整个表单上捕获像 F1 这样的特定键控事件。并且我不想转到捕获窗体上所有其他控件的 KeyDown 并将它们传递给窗体进行处理的路由。有没有更干净的方法可以做到这一点?
是的,确实有。无论当前具有输入焦点的控件如何,窗体处理键事件的正确方法是重写窗体类的 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