我有一个有几个按钮的表单。我将KeyPreview设置为true,并且Keydown
,KeyPress
和所有正在读取的keyup事件
form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
e.handled = true;
}
出于某种原因,回车键仍然会点击具有焦点的按钮。我错过了什么?有办法吗?
答案 0 :(得分:3)
使用焦点按钮按Form
上的Enter键会调用Form.ProcessCmdKey
method:
在消息预处理期间调用此方法来处理命令键。 命令键是始终优先于常规输入键的键。命令键示例包括加速键和菜单快捷键。
您可以覆盖此方法以将密钥标记为已处理:
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);
}
如果您只想在按下按钮时忽略Enter,则可以使用以下内容:
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);
}
答案 1 :(得分:1)
如果您的按钮设置为表单上的AcceptButton
属性,则可能会发生这种情况。如果是这种情况,请清除该属性。
答案 2 :(得分:0)
除了其他答案之外,您可以向表单中添加KeyDown
事件处理程序,在KeyEventArgs
中有一个SuppressKeyPress
属性可以防止您的Keypress被发送到父母控制。
还可以看到这个SO question处理和SuppressKeyPress之间的差异,
来自SuppressKeyPress链接:
获取或设置一个值,该值指示是否应将键事件传递给基础控件。
示例:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter )
e.SuppressKeyPress = true;
}