我使用了KeyDown事件和一些简单的代码(如if (e.KeyCode == Keys.F1)
)来捕获表单上的F1,但是如果表单上有一些文本框,或者表单上有一些带有Dock Fill的电子表格,那么上面的代码就没有用了,什么也不做。但是当用户在这个表单上按下F1时,我想做一些事情。那么,我们如何在整个form..and上捕获像F1这样的特定按键事件呢?我不想转到捕获表单上所有其他控件的keydown并将它们传递给表单进行处理的路由。有没有更干净的方法来做这件事?
发布于 2011-05-10 14:22:12
是的,确实有。窗体处理键事件的正确方法是重写窗体类的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。这是从VB6天开始的一个时代错误,并且在.NET世界中并不是真正的首选方法。进一步阅读:Disadvantage of setting Form.KeyPreview = true?
发布于 2011-05-10 14:21:23
将窗体的KeyPreview
设置为true。这将确保窗体首先获得按键消息,如果您处理了它,您可以设置e.Handled = true
,这样它就不会向下传递到控件。
发布于 2011-05-10 14:21:09
打开KeyPreview
,表单中的每一次按键都将首先通过其按键事件处理程序进行路由。
https://stackoverflow.com/questions/5951496
复制相似问题