当我按下按钮时,我想知道为什么我的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发生冲突?我永远不会覆盖默认方法,但这次我被迫。
答案 0 :(得分:1)
我相信你的ProcessCmdKey
多次触发的原因是:
每个MSDN:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspxProcessCmdKey方法首先确定控件是否具有ContextMenu,如果是,则启用ContextMenu来处理命令键。如果命令键不是菜单快捷方式且控件具有父级,则该键将传递给父级的ProcessCmdKey方法。实际效果是命令键在控制层次结构中“冒泡”。除了用户按下的键之外,键数据还指示与键同时按下哪些修改键(如果有的话)。修饰键包括SHIFT,CTRL和ALT键。
在你的方法中,我看到你正在检查哪个控件是关注的。所以这个方法是为该控件触发,然后是父控件(我假设是表单),因为聚焦控件不太可能有快捷键或其他任何东西。