我有一个表单,其中有几个按钮。我已将KeyPreview设置为true,并且我有KeyDown
、KeyPress
和KeyUp事件都在读取。
form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
e.handled = true;
}
出于某种原因,回车键仍然会点击具有焦点的按钮。我错过了什么?有没有解决方法?
当在一个拥有聚焦按钮的表单上按下回车键时,会调用 Form.ProcessCmdKey
方法:
此方法在消息预处理期间被调用以处理命令键。 命令键始终优先于普通输入键。 命令键的示例包括加速器和菜单快捷方式。
您可以重写此方法来标记该键已处理:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// if enter pressed, return 'true' to skip default handler
if ((keyData & Keys.Return) == Keys.Return)
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
如果您只想在按钮获得焦点时忽略回车键,可以使用以下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// if a button is focused AND enter pressed, skip default handler
if (this.ActiveControl is Button && (keyData & Keys.Return) == Keys.Return)
return true;
return base.ProcessCmdKey(ref msg, keyData);
}
AcceptButton
属性,那么就有可能出现这种情况。如果是这种情况,只需清除该属性即可。KeyDown
事件处理程序,在其KeyEventArgs
中有一个SuppressKeyPress
属性,它将防止您的按键被发送到父控件。例如:获取或设置一个值,该值指示是否应将键事件传递给基础控件。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter )
e.SuppressKeyPress = true;
}