首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何捕获Keys.F1而不考虑窗体上的焦点控件?

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

Stack Overflow用户
提问于 2011-05-10 22:19:53
回答 4查看 37.4K关注 0票数 30

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-10 22:22:12

是的,确实有。窗体处理键事件的正确方法是重写窗体类的ProcessCmdKey method,而不管当前具有输入焦点的控件是什么:

代码语言:javascript
运行
复制
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?

票数 60
EN

Stack Overflow用户

发布于 2011-05-10 22:21:23

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

票数 5
EN

Stack Overflow用户

发布于 2011-05-10 22:21:09

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5951496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档