停止Winform按键到达子控件

时间:2014-07-23 12:43:41

标签: c# winforms

我有一个有几个按钮的表单。我将KeyPreview设置为true,并且KeydownKeyPress和所有正在读取的keyup事件

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

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

3 个答案:

答案 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;
}