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
多次开火的原因是:
ProcessCmdKey方法首先确定控件是否具有上下文菜单,如果有,则使上下文菜单能够处理命令键。如果命令键不是菜单快捷方式,并且控件有父控件,则将该键传递给父控件的ProcessCmdKey方法。最终的效果是命令键在控制层次结构中"冒泡"。除了用户按下的键之外,键数据还显示了与该键同时按下的修饰键(如果有)。修改键包括SHIFT、CTRL和ALT键。
每个MSDN: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx
在你的方法中,我看到你正在检查哪个控件是聚焦的。这个方法会触发那个控件,然后触发父控件(我假设是表单)因为有焦点的控件不太可能有快捷键之类的