无法捕获Enter键

时间:2012-05-17 18:46:47

标签: c# keyevent enter

我有一个简单的表单,我可以通过它输入:

12个按钮,1个文本框(禁用和只读)

enter image description here

这就是我处理输入的方法

Login_KeyDown()是我调用每个UI组件的所有 KeyDown 的常用方法。表格本身..

private void Login_KeyDown(object sender, KeyEventArgs e)
{            
  if (e.KeyCode == Keys.Escape)
  {
    Application.Exit();
  }
  else if (e.KeyCode == Keys.NumPad9 || e.KeyCode == Keys.D9)
  {
    button3.BackgroundImage = Properties.Resources.button_hover;
    button3.ForeColor = Color.White;
    pin.Text = pin.Text + "9";
  }
  else if (e.KeyCode == Keys.Back)
  {
    button11.BackgroundImage = Properties.Resources.button_hover;
    button11.ForeColor = Color.White;
    if (pin.Text.Length > 0)
      pin.Text = pin.Text.Substring(0, pin.Text.Length - 1);
  }
  else if (e.KeyCode == Keys.Enter)
  {
    MessageBox.Show(pin.Text);
  }
}

当我启动应用程序时,此代码正常工作但在我点击任何组件后,其余代码工作正常,但“输入密钥条件”不起作用。

我的猜测是“输入密钥条件”不适用于UI组件或类似的东西。

我还尝试使用“按键事件”,它使用 KeyPressEventArgs ,然后检查 KeyChar == 13 ,但这也无效。

有什么问题,我该如何解决?

P.S。 我没有为任何按钮设置任何按钮点击事件,该应用程序是100%基于KBoard。

3 个答案:

答案 0 :(得分:2)

查看PreviewKeyDown。返回会在按钮控件上引发该事件。

    private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Return)
            MessageBox.Show("I found return");

    }

或者您可以使用以下方法强制它在KeyDown事件中引发这些特殊键:

    private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Return)
            e.IsInputKey = true;
    }

更多信息:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

答案 1 :(得分:0)

您是否尝试过使用

Keys.Return

相反

编辑: 想到这一点。您是否为主窗体设置了接受按钮?

答案 2 :(得分:0)

这是因为您的表单已定义了AcceptButton。例如,您有一个“确定”,“接受”或“确认”按钮,并且DialogResult设置为“确定”。这告诉它的父窗体有一个AcceptButton,窗体上的Enter事件将转到该按钮。

您应该做的是在表单级别捕获Enter键。将此代码添加到表单:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if ((this.ActiveControl == myTextBox) && (keyData == Keys.Return))
    {
        //do something
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}