C# 如何在windows窗体组合框中捕获enter键

C# 如何在windows窗体组合框中捕获enter键,c#,windows,winforms,combobox,C#,Windows,Winforms,Combobox,当windows窗体组合框处于活动状态时,如何捕获该组合框中的enter键 我试着听KeyDown和KeyPress,我创建了一个子类并重写了ProcessDialogKey,但似乎没有任何效果 有什么想法吗 /p将按键事件连接到如下方法: protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 13) { MessageBox.Show("E

当windows窗体组合框处于活动状态时,如何捕获该组合框中的enter键

我试着听KeyDown和KeyPress,我创建了一个子类并重写了ProcessDialogKey,但似乎没有任何效果

有什么想法吗


/p

将按键事件连接到如下方法:

protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        MessageBox.Show("Enter pressed", "Attention");                
    }
}
我已经用VS2008在WinForms应用程序中测试了这一点,并且效果良好


如果它不适用于您,请发布您的代码。

或者,您也可以连接KeyDown事件:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        MessageBox.Show("Enter pressed.");
    }
}

如果在表单上定义了AcceptButton,则不能在KeyDown/KeyUp/KeyPress中侦听Enter键

为了检查是否存在这种情况,您需要覆盖表单上的ProcessCmdKey:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if ((this.ActiveControl == myComboBox) && (keyData == Keys.Return)) {
        MessageBox.Show("Combo Enter");
        return true;
    } else {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

在本例中,如果您使用的是组合框,并且它对所有其他控件都像以前一样工作,则会显示消息框。

可能是您的对话框中有一个按钮正在吞噬enter键,因为它被设置为form属性中的AcceptButton。
如果是这种情况,那么您可以通过在控件获得焦点时取消设置AcceptButton属性来解决这个问题,然后在控件失去焦点时将其重置回来(在我的代码中,button1是accept按钮)

我必须承认,我不喜欢自己的解决方案,因为取消设置/设置AcceptButton属性似乎有点麻烦,所以如果有人有更好的解决方案,我会感兴趣的

尝试以下方法:

private void comboBox1_KeyDown( object sender, EventArgs e )
{
   if( e.KeyCode == Keys.Enter )
   {
      // Do something here...
   } else Application.DoEvents();
}
protected override bool ProcessCmdKey(ref Message msg, Keys k)
{
    if (k == Keys.Enter || k == Keys.Return)
    {
        this.Text = null;
        return true;
    }

    return base.ProcessCmdKey(ref msg, k);
}

别忘了在表单上将KeyPreview设置为true。

我已经尝试过了。它不起作用。你自己试试看。这就是我发布这个问题的原因。一个可能的原因是其他一些事件处理程序先捕获enter,然后停止其他处理程序的工作。例如菜单或表单本身。你是对的。。。当我隔离代码以使其“可邮寄”时,它确实起作用,因此错误必须位于其他地方。我会尝试用Petros的提示搜索。谢谢大家。如果(e.KeyChar==(char)Keys.Enter){}表单上有一个名为KeyPreview的属性,请启用它。我猜您是否定义了AcceptButton?
protected override bool ProcessCmdKey(ref Message msg, Keys k)
{
    if (k == Keys.Enter || k == Keys.Return)
    {
        this.Text = null;
        return true;
    }

    return base.ProcessCmdKey(ref msg, k);
}
protected void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)  // or Key.Enter or Key.Return
    {
        MessageBox.Show("Enter pressed", "KeyPress Event");                
    }
}