当组合框处于活动状态时,如何在Windows窗体组合框中捕获回车键?
我试图听KeyDown和KeyPress,我已经创建了一个子类并覆盖了ProcessDialogKey,但似乎没有任何效果。
有什么想法吗?
/ P
答案 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:
上的ProcessCmdKeyprotected 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。