ProcessCmdKey两次触发,WinForms

时间:2015-09-16 20:21:10

标签: c# winforms events richtextbox

当我按下按钮时,我想知道为什么我的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发生冲突?我永远不会覆盖默认方法,但这次我被迫。

1 个答案:

答案 0 :(得分:1)

我相信你的ProcessCmdKey多次触发的原因是:

  

ProcessCmdKey方法首先确定控件是否具有ContextMenu,如果是,则启用ContextMenu来处理命令键。如果命令键不是菜单快捷方式且控件具有父级,则该键将传递给父级的ProcessCmdKey方法。实际效果是命令键在控制层次结构中“冒泡”。除了用户按下的键之外,键数据还指示与键同时按下哪些修改键(如果有的话)。修饰键包括SHIFT,CTRL和ALT键。

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

在你的方法中,我看到你正在检查哪个控件是关注的。所以这个方法是为该控件触发,然后是父控件(我假设是表单),因为聚焦控件不太可能有快捷键或其他任何东西。