C# 火形按键事件

C# 火形按键事件,c#,.net,winforms,events,keyevent,C#,.net,Winforms,Events,Keyevent,我有一个C#winform,上面有一个按钮。 现在,当我运行我的应用程序时,按钮会自动获得焦点 问题是我的表单的KeyPress事件不起作用,因为按钮已聚焦 我试过这个.Focus()打开FormLoad()事件,但按键事件仍不起作用 尝试将窗体的属性设置为True。您需要覆盖窗体的属性。这是当子控件具有键盘焦点时,通知您发生按键事件的唯一方法 示例代码: protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {

我有一个C#winform,上面有一个按钮。
现在,当我运行我的应用程序时,按钮会自动获得焦点

问题是我的表单的
KeyPress
事件不起作用,因为按钮已聚焦

我试过
这个.Focus()打开
FormLoad()
事件,但按键事件仍不起作用

尝试将窗体的属性设置为True。

您需要覆盖窗体的属性。这是当子控件具有键盘焦点时,通知您发生按键事件的唯一方法

示例代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // look for the expected key
    if (keyData == Keys.A)
    {
        // take some action
        MessageBox.Show("The A key was pressed");

        // eat the message to prevent it from being passed on
        return true;

        // (alternatively, return FALSE to allow the key event to be passed on)
    }

    // call the base class to handle other key events
    return base.ProcessCmdKey(ref msg, keyData);
}
至于为什么
this.Focus()
不起作用,那是因为表单本身不能拥有焦点。特定控件必须具有焦点,因此当您将焦点设置为窗体时,它实际上会将焦点设置为第一个可以接受具有最低
TabIndex
值的焦点的控件。在本例中,这是您的按钮。

我将使用以下选项之一:

  • 将按钮的TabIndex属性设置为0

  • 将按钮的IsDefault属性设置为true-因此,按下ENTER键时将触发该属性


  • 在主窗体上设置keyPreview=true

    我遇到了同样的问题,我知道这个问题很久以前就得到了回答,但我对这个问题的解决方案来自另一个堆栈溢出问题,在这个问题中,我唯一的按钮抓住并保持焦点。我接受了用户的建议,创建了一个无法获得焦点的按钮

    也许有人会发现这很有用:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace I2c_Programmer {
        class NoSelectButton : Button{
    
                public NoSelectButton() {
    
                SetStyle(ControlStyles.Selectable, false);
    
            }
        }
    }
    

    进入您的设计器,在那里创建按钮并切换出新系统…使用新类“new NoSelectButton();”

    button可以,但是当我的按钮也有keyPress事件时,两个keyPress事件都将被触发。这不是一个好的解决方案。它不适用于所有可能的键,它不能防止控件窃取键事件,而且它更像是一种老式的VB6处理方式。重写
    ProcessCmdKey
    是惯用的方法。@CodyGray:但是,当目标是接收
    KeyPress
    事件时,这是一种合适的替代方法。显然,在使用它时需要小心,但它通常比尝试将特定的键事件映射到字符更容易/更简单。嗯,他说,当加载表单时,按钮具有焦点,因此我只能假设当用户按下Enter(或空格)键时,它已经在响应。问题并没有具体说明他想要抓住的某个键;我怀疑它可能不是Enter。请注意ProcessCmdKey()不是按键的替代品。虚拟键和它们被翻译成的字符之间有很大的区别。没有好的方法可以获得与按键相同的效果。