C#:表单接收除 ENTER 键之外的所有按键

C#: Form receives all keypresses except the ENTER key

我正在设计一个自定义计算器。在此计算器表单上按下的任何键都应在 'Form' 级别捕获。为此,我有以下代码-

private void BindControlMouseClicks(Control con)
{
    con.MouseClick += delegate(object sender, MouseEventArgs e)
    {
        TriggerMouseClicked(sender, e);
    };
    // bind to controls already added
    foreach (Control i in con.Controls)
    {
        BindControlMouseClicks(i);
    }
    // bind to controls added in the future
    con.ControlAdded += delegate(object sender, ControlEventArgs e)
    {
        BindControlMouseClicks(e.Control);
    };
}
private void TriggerMouseClicked(object sender, MouseEventArgs e)
{
}

private void Form1_Load(object sender, EventArgs e)
{
    this.KeyPreview = true;
    this.KeyPress +=new KeyPressEventHandler(Form1_KeyPress);

    BindControlMouseClicks(this);
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
    this.MaximizeBox = false;
}

void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    string key;
    switch (e.KeyChar)
    {
        case '\r':
            key = "ENTER";
            break;
        case ' ':
            key = "SPACE";
            break;

        case (char)27:
            key = "ESCAPE";
            break;
        default:
            key = e.KeyChar.ToString();
            break;

    }
    /* Some other code */
}

我在事件处理函数中设置了断点并添加了调试语句Form1_Keypress。令人惊讶的是,除了 ENTER 键外,所有相关键(数字、字母、转义、Space 等)都按下了回调函数。 NUMPAD ENTER 键也会发生这种情况。

知道为什么只有 ENTER 键的处理方式不同吗?

编辑

我的表单有一堆按钮和一个文本框。当我将焦点放在文本框上时,瞧,也会为 ENTER 键调用回调!但是,如果我将焦点放在任何按钮上,则 ENTER 按键不会生成任何事件。由于我已将 KeyPreview 设置为 true,因此无论焦点位于何处,表单都必须获取此事件,对吗?

编辑 2

只有当表单上有按钮并且至少有一个按钮聚焦在该按钮上时才会发生这种情况。如果任何其他控件关注它,它就可以正常工作。我还没有设置表单的 AcceptButton 属性。

As MSDN says(.NET TextBox - Handling the Enter Key), 你可以尝试使用 (char)Keys.Return 而不是 \r:

switch (e.KeyChar)
{
    case (char)Keys.Return:
        key = "ENTER";
        break;

也可能有some button with AcceptsReturn property set to true on the form?

当我的表单上的任何按钮获得焦点时,就会出现我描述的问题。所以我做了这两件事-

  1. 最初设置any_button.TabStop = false。这确保 none 个按钮在启动表单时获得焦点

  2. 当我们用鼠标点击一个按钮时,它会重新获得焦点。我们最终遇到了同样的问题。为了解决这个问题,在鼠标点击处理程序中,我只是将焦点从按钮传递到其他控件。例如,我的表单有一个菜单条,我刚刚在鼠标单击处理程序中调用了 menustrip1.Focus()

现在,ENTER 按键被捕获在 Form_Keypress 处理程序中。

这是一种解决方法。但是我还没有弄清楚为什么 ENTER 当焦点在按钮而不是其他控件上时,按键没有被表单捕获。我很乐意为这个 Qn

提供更多答案