检测表单上未使用的命令键 - winforms

时间:2016-12-22 18:42:40

标签: c# forms winforms

我有一个包含多个输入控件(组合框,文本框)的表单。我想关闭转义键上的表单,但仅当输入控件没有使用按键时。让我们说重点放在一个开放(下拉)组合框上。按下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,但我必须做其他事情。

怎么做?

1 个答案:

答案 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);
}