【问题标题】:Stop Winform keystroke from reaching child control阻止 Winform 击键到达子控件
【发布时间】:2014-07-23 12:43:40
【问题描述】:

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

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

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

【问题讨论】:

  • 您的按钮是否设置为“接受”按钮?

标签: c# winforms


【解决方案1】:

如果您的按钮设置为表单上的AcceptButton 属性,则可能会发生这种情况。如果是这种情况,只需清除该属性即可。

【讨论】:

    【解决方案2】:

    在带有焦点按钮的 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);
    }
    

    【讨论】:

    • 内容丰富且全面。我不知道 Forms 以不同的方式处理命令键。知道非常有用。谢谢。
    【解决方案3】:

    除了其他答案之外,您还可以将KeyDown 事件处理程序添加到您的表单中,在其KeyEventArgs 中有一个SuppressKeyPress 属性将阻止您的Keypress 被发送到父控件。

    另请参阅SO question,了解handled 和 SuppressKeyPress 之间的区别,

    来自 SuppressKeyPress 链接:

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

    示例:

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

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 2015-12-22
      • 2017-12-28
      • 1970-01-01
      相关资源
      最近更新 更多