阻止Winform按键事件传递给子控件

4

我有一个表单,其中有几个按钮。我已将KeyPreview设置为true,并且我有KeyDownKeyPress和KeyUp事件都在读取。

form_keyevent(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    e.handled = true;
}

出于某种原因,回车键仍然会点击具有焦点的按钮。我错过了什么?有没有解决方法?


你的按钮设置为“接受”按钮了吗? - rory.ap
3个回答

3

当在一个拥有聚焦按钮的表单上按下回车键时,会调用 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);
}

非常详细和有用的信息。我不知道表单会以不同的方式处理命令键。这对我很有帮助。谢谢。 - Patrick Schomburg

2
如果您的按钮被设置为表单上的 AcceptButton 属性,那么就有可能出现这种情况。如果是这种情况,只需清除该属性即可。

0
除了其他答案之外,您可以在表单中添加一个KeyDown事件处理程序,在其KeyEventArgs中有一个SuppressKeyPress属性,它将防止您的按键被发送到父控件。
此外,还可以查看这个SO问题,了解handled和SuppressKeyPress之间的区别。
从SuppressKeyPress链接中可以看到:

获取或设置一个值,该值指示是否应将键事件传递给基础控件。

例如:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode  == Keys.Enter )
        e.SuppressKeyPress = true;
}

当相同的快捷键被添加到菜单中,并添加到Form1_Designer.cs后,Form1_KeyDown() 中的键盘快捷键将停止工作。 - Ray Chakrit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接