2016-12-22 52 views
1

我有一個帶有幾個輸入控件(組合框,文本框)的窗體。我想關閉轉義鍵上的表單,但只有當輸入控件沒有使用按鍵。讓我們說重點是開放(下降)組合框。按Esc鍵將關閉組合框的下拉部分 - 因此,我不想關閉該窗體。但是如果組合框未打開,按Esc將不會對組合框執行任何操作,所以我想關閉窗體。 我認爲重寫窗體的ProcessCmdKey將完成這項工作。我試過在窗體上檢測未消耗的命令鍵 - winforms

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, Keys keyData) 
{ 
    bool consumed = base.ProcessCmdKey(ref msg, keyData); 
    if (!consumed) 
     Close(); 
} 

但是'消耗'總是錯誤的(在我的測試用例中),無論是否有任何形式的控件發生。 也許這是一個不好的方法,我不需要重寫ProcessCmdKey,但我必須做其他事情。

怎麼辦?

+0

嘗試重寫['ProcessDialogKey'(https://msdn.microsoft.com/en-us/library/system.windows.forms。 control.processdialogkey(v = vs.110).aspx)。當然,不要忘記檢查「ESC」鍵。 –

+0

你爲什麼需要這個。在模態WinForms對話框中,您可以通過添加一個取消按鈕來關聯Esc ... – Phil1970

回答

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; 
} 

以上就足以與組合框工作,我問的問題。 但是,如果您已經爲TextBox的某些撤消功能添加了一些對Esc作出反應的功能,並且您希望以類似的方式創建工作文本框(如果撤消完成,則不要關閉窗體,如果沒有撤消操作,則關閉窗體表格)您需要重寫文本框的ProcessDialogKey爲好,如:

protected override bool ProcessDialogKey(Keys keyData) 
{ 
    if (keyData == Keys.Escape) 
    { 
     bool undoWasDone = Undo(); 
     if (undoWasDone) 
      return true; 
    } 
    return base.ProcessDialogKey(keyData); 
}