如何捕获Windows窗体combobox中的回车键

combobox处于活动状态时,如何捕获窗口combobox中的回车键?

我试着听KeyDown和KeyPress,我已经创build了一个子类,并重写ProcessDialogKey,但似乎没有任何工作。

有任何想法吗?

/ P

Solutions Collecting From Web of "如何捕获Windows窗体combobox中的回车键"

将KeyPress事件连接到这样一个方法:

protected void myCombo_OnKeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 13) { MessageBox.Show("Enter pressed", "Attention"); } } 

我已经在VS2008的WinForms应用程序中测试过了,它可以工作。

如果它不适合你,请发布你的代码。

如果您在窗体上定义了AcceptButton,则无法在KeyDown / KeyUp / KeyPress中听到Enter键。

为了检查这一点,你需要覆盖FORM上的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); } } 

在这个例子中,如果你在组合框上,它会给你一个消息框,它和其他所有的控件一样。

或者可以改变你可以挂钩的KeyDown事件:

 private void comboBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { MessageBox.Show("Enter pressed."); } } 
 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); } 

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

 private void comboBox1_Enter(object sender, EventArgs e) { this.AcceptButton = null; } private void comboBox1_Leave(object sender, EventArgs e) { this.AcceptButton = button1; } private void comboBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { MessageBox.Show("Hello"); } } 

我不得不承认我不喜欢我自己的解决方案,因为它似乎有点hacky取消/设置AcceptButton属性,所以如果任何人有更好的解决方案,那么我会感兴趣

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

不要忘记在表单上将KeyPreview设置为true。