ProcessCmdKey触发两次,WinForms

本文关键字:两次 WinForms ProcessCmdKey | 更新日期: 2023-09-27 18:13:07

我想知道为什么我的ProcessCmdKey触发两次,当我按下按钮。下面是我的代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                if (this.tsComboBoxFontChoice.Focused)
                {
                    this.tsComboBoxFontChoice.Text = this.startFontComboBoxText;
                    this.richTextBox.Focus();
                    this.tsComboBoxFontChoice.Focus();
                    this.isEscClicked = true;
                    return true;
                }
                else if (this.tsComboBoxFontSizeChoice.Focused)
                {
                    this.tsComboBoxFontSizeChoice.Text = this.startFontSizeComboBoxText;
                    this.tsComboBoxFontSizeChoice.Focus();
                    return true;
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

我也定义了KeyDown事件为我的形式,可能这是原因吗?

还有一个:如果我想为RichTextBox定义KeyDown/KeyUp/KeyPressed事件,它不会与ProcessCmdKey碰撞吗?我从来没有重写过默认方法,但这次我不得不这样做。

ProcessCmdKey触发两次,WinForms

我相信你的ProcessCmdKey多次开火的原因是:

ProcessCmdKey方法首先确定控件是否具有上下文菜单,如果有,则使上下文菜单能够处理命令键。如果命令键不是菜单快捷方式,并且控件有父控件,则将该键传递给父控件的ProcessCmdKey方法。最终的效果是命令键在控制层次结构中"冒泡"。除了用户按下的键之外,键数据还显示了与该键同时按下的修饰键(如果有)。修改键包括SHIFT、CTRL和ALT键。

每个MSDN: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx

在你的方法中,我看到你正在检查哪个控件是聚焦的。这个方法会触发那个控件,然后触发父控件(我假设是表单)因为有焦点的控件不太可能有快捷键之类的