如何在Windows窗体组合框中捕获回车键

时间:2009-08-04 10:21:40

标签: c# windows winforms combobox

当组合框处于活动状态时,如何在Windows窗体组合框中捕获回车键?

我试图听KeyDown和KeyPress,我已经创建了一个子类并覆盖了ProcessDialogKey,但似乎没有任何效果。

有什么想法吗?

/ P

7 个答案:

答案 0 :(得分:18)

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

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

我已经在VS2008的WinForms应用程序中对此进行了测试,但它确实有效。

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

答案 1 :(得分:17)

如果您在表单上定义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);
    }
}

在此示例中,如果您在组合框中,它将为您提供消息框,并且它像以前一样用于所有其他控件。

答案 2 :(得分:9)

或者您可以将KeyDown事件挂钩:

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

答案 3 :(得分:1)

private void comboBox1_KeyDown( object sender, EventArgs e )
{
   if( e.KeyCode == Keys.Enter )
   {
      // Do something here...
   } else Application.DoEvents();
}

答案 4 :(得分:1)

试试这个:

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>


@interface keyObject : NSObject
- (void)mouseDown:(NSEvent *)theEvent;
@end




@implementation keyObject
- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"keypress detected!");
}

@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"test");
        keyObject * myObject = [[keyObject alloc] init];
    }
    while (1) {
    // Waiting for event to trigger?
    }
    return 0;
}

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