我使用了 KeyDown 事件和一些简单的代码if (e.KeyCode == Keys.F1)
,例如捕获 F1 在表单上被按下但是如果表单上有一些文本框或者如果表单上有一些带有 Dock Fill 的电子表格,那么上面的代码将变得无用并且什么都不做。但是当用户在此表单上按 F1 时,我想做一些事情。那么我们如何在整个表单上捕获特定的 keydown 事件,例如 F1 ......我不想去捕获表单上所有其他控件的 KeyDown 并将它们传递给表单进行处理的路由。有没有更清洁的方法来做到这一点?
问问题
37563 次
4 回答
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);
}
您返回true
以表明您处理了击键并且不希望将其传递给其他控件。如果您确实希望将其传递给其他控件的事件处理程序,只需 return false
。
你最好不要忽略这个KeyPreview
属性。这是 VB 6 天以来的时代错误,并不是 .NET 世界中这样做的首选方式。进一步阅读:设置 Form.KeyPreview = true 的缺点?
于 2011-05-10T14:22:12.467 回答
5
将表单设置KeyPreview
为 true。这将确保表单首先获得按键消息,如果您处理它,您可以设置e.Handled = true
它不会传递给控件。
于 2011-05-10T14:21:23.460 回答
4
打开,KeyPreview
表单中的每个按键都将首先通过它的按键事件处理程序进行路由。
于 2011-05-10T14:21:09.180 回答
3
另一种方法是覆盖 ProcessCmdKey 函数http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx
于 2011-05-10T14:22:54.743 回答