我有一个包含多个输入控件(组合框,文本框)的表单。我想关闭转义键上的表单,但仅当输入控件没有使用按键时。让我们说重点放在一个开放(下拉)组合框上。按下Esc将关闭组合框的下拉部分 - 因此,我不想关闭表单。但是如果组合框没有打开,按Esc不会对组合框做任何事情,所以我想关闭表格。 我认为压倒形式的ProcessCmdKey会完成这项工作。我试过了
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, Keys keyData)
{
bool consumed = base.ProcessCmdKey(ref msg, keyData);
if (!consumed)
Close();
}
但消费了'总是假的(在我的测试案例中),无论是否有任何形式的控件发生。 也许这是一个糟糕的方法,我不需要覆盖ProcessCmdKey,但我必须做其他事情。
怎么做?
答案 0 :(得分:1)
基于Ivan Stoev的评论,ProcessDialogKey似乎是一个很好的解决方案。
形式:
protected override bool ProcessDialogKey(Keys keyData)
{
bool consumed = base.ProcessDialogKey(keyData);
if (!consumed && keyData == Keys.Escape)
{
Close();
consumed = true;
}
return consumed;
}
正如我在问题中所提到的,仅上述内容足以与ComboBox一起使用。 但是,如果您已经向TextBox添加了一些撤消功能以对Esc作出反应,并且您希望以类似的方式创建工作TextBox(如果撤消已完成,则不要关闭表单,否则撤消是可能的,然后关闭表单)你需要覆盖TextBox的ProcessDialogKey,例如:
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
bool undoWasDone = Undo();
if (undoWasDone)
return true;
}
return base.ProcessDialogKey(keyData);
}