【问题标题】:C#: Form receives all keypresses except the ENTER keyC#:表单接收除 ENTER 键之外的所有按键
【发布时间】:2015-03-16 23:44:17
【问题描述】:

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

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 键之外,所有相关键(数字、字母、Escape、空格等)都击中了回调函数。 NUMPAD ENTER 键也会发生这种情况。

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

编辑

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

编辑 2

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

【问题讨论】:

  • 按回车键会发生什么?它抛出异常?它什么都不做?
  • @ChrisCreateBoss 没有任何反应。没有例外或任何东西。
  • 表单中有文本框或按钮等组件吗?也许输入键附加到文本框,因此它正在聚焦它,或者如果是按钮,它正在尝试激活它。还可以尝试在您的按键事件处理程序中放置断点,调试,按回车键,看看是否发生了什么。
  • 您是否考虑过使用表单的AcceptButton 属性来绑定您的“计算”或“=”按钮,假设您有这样的东西?
  • @NeillVerreynne 这不是重复的。我不希望按键进入文本框。我已设置 KeyPreview=true 以获取表单级别的所有按键

标签: c# .net forms keypress


【解决方案1】:

作为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

【讨论】:

  • 感谢您的建议,但我的问题是,回调函数根本没有被调用!!
  • 我复制粘贴您的代码,除了 BindControlMouseClicks() 调用,并且在 KeyPress 事件处理程序的末尾我有 textBox.Text = key。它对我有用 - 当我在表单上按 ENTER 时,textBox 会收到 ENTER 文本。
  • 可能你会透露做 BindControlMouseClicks() 函数的工作是什么?
  • 我不想按 ENTER 键转到文本框。我想在表单级别处理 ENTER 。您是否检查了 ENTER 键是否触发 Form_Keypress()?我要为 BindControlMouseCLicks() 添加代码是我的问题
  • 是的,我检查了 Form_Keypress 是否被触发。我添加了 BindControlMouseClicks,仍然有效。你能自己创建一个简单的项目来确信这个简单的东西是有效的吗?
【解决方案2】:

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

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

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

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

这是一种解决方法。但是我还没有弄清楚为什么当焦点在按钮而不是其他控件上时表单没有捕获 ENTER 按键。我很高兴有更多关于这个 Qn 的答案

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2010-10-28
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多