无法捕捉回车键

3

我有一个简单的表单来接收输入:

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);
  }
}

这段代码在我启动应用程序后正常工作,但是在我点击任何组件后,“Enter Key Condition”就不起作用了。
我的猜测是,“Enter Key Condition”在UI组件中无法工作或类似的问题。
我也尝试使用“Key Press Event”,它使用KeyPressEventArgs,然后检查KeyChar == 13,但那也不起作用。
问题出在哪里?我该如何解决?
附言:我没有为任何按钮设置按钮单击事件,该应用程序完全基于KBoard。
3个回答

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

另一个相关的SO讨论:http://stackoverflow.com/questions/267198/always-handle-the-previewkeydown-event-in-a-base-form - deepee1

1

你尝试过使用吗?

Keys.Return

相反

编辑: 刚想到这个。您是否已将acceptbutton设置为主窗体?


或者在函数上设置一个断点,观察当您按下返回键时会发生什么。 - dvallejo
这篇文章说它们是一样的。尝试一下也无妨,毕竟你永远不知道会发生什么。 - General Grey
@JunaidSaeed,第二部分怎么样了?你是否使用了acceptbutton,或者你的文本框acceptReturn设置为true? - General Grey
acceptReturn被设置为false,但这与问题没有任何关系,无论'else if (e.KeyCode == Keys.Enter)'里面是什么。一旦我点击任何UI,它就停止工作了... 不是里面的代码,而是条件本身,也就是说在那之后,“Enter”不会在任何UI项上调用KeyDown...我还尝试使用KeyChar的KeyPress,但没有用。 - Moon

1
这是因为您的表单已定义了AcceptButton。例如,您有一个名为“OK”,“Accept”或“Confirm”的按钮,并将DialogResult设置为“OK”。这告诉其父窗体存在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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接