C#:表单接收除回车键以外的所有按键

C#:表单接收除回车键以外的所有按键,c#,.net,forms,keypress,C#,.net,Forms,Keypress,我正在设计一个定制计算器。在此计算器窗体上按下的任何键都应在“窗体”级别捕获。为此,我编写了以下代码- private void BindControlMouseClicks(Control con) { con.MouseClick += delegate(object sender, MouseEventArgs e) { TriggerMouseClicked(sender, e); }; // bind to controls alread

我正在设计一个定制计算器。在此计算器窗体上按下的任何键都应在“窗体”级别捕获。为此,我编写了以下代码-

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\u Keypress
中设置了断点并添加了调试语句。令人惊讶的是,除ENTER键外,所有相关键(数字、字母、转义符、空格等)都会命中回调函数。NUMPAD ENTER键也会发生这种情况

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

编辑

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

编辑2

只有当表单上有按钮并且其中至少有一个有焦点时,才会发生这种情况。如果任何其他控件对其进行了聚焦,则其工作正常。我没有设置窗体的
AcceptButton
属性。

作为(),您可以尝试使用
(char)键。返回
而不是
\r

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

也可能有?

当窗体上的任何按钮都有焦点时,我描述的问题就会出现。所以我做了这两件事-

  • 最初设置
    any_按钮。TabStop=false
    。这样可以确保在启动表单时没有任何按钮获得焦点

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

  • 现在,回车键被捕获在
    表单\u Keypress
    处理程序中


    这是一个解决办法。但我还没有弄明白,当焦点在按钮上而不是其他控件上时,为什么enterkeypress不会被窗体捕获。我很高兴有更多关于这个问题的答案

    如果按回车键会发生什么?它抛出异常?它什么都没做?@ChrisCreateBoss什么都没发生。没有例外。你的表单中有文本框或按钮之类的组件吗?可能输入键被连接到一个文本框,所以它会聚焦它,或者如果是一个按钮,它会试图激活它。还可以尝试在按键事件处理程序中设置断点,调试,按enter键,看看是否发生了什么事情。您是否考虑过使用表单的
    AcceptButton
    属性来绑定“计算”或“=”按钮,假设您有这样的东西?@Neilvereynne它不是重复的。我不希望按键转到文本框。我已经将KeyPreview=true设置为表单级别的所有按键。谢谢你的建议,但我的问题是,根本没有调用回调函数!!我复制粘贴您的代码,除了BindControlMouseClicks()调用,在按键事件处理程序的末尾,我有
    textBox.Text=key
    。它适用于我-当我在表单上按ENTER键时,textBox接收ENTER文本。您可能会透露BindControlMouseClicks()函数是做什么工作的?我不希望按ENTER键转到textBox。我想在表单级别处理ENTER。您是否检查了ENTER键是否触发表单_Keypress()?我将为BindControlMouseCLicks()添加代码是我的问题是的,我检查了Form_按键是否被触发。我添加了BindControlMouseClicks,仍然有效。你能自己创建一个简单的项目来确信这些简单的事情是有效的吗?