2012-02-17 54 views
3

在我的應用程序中,我已將鍵盤快捷鍵(一個事件處理程序)添加到TextBox。一個是Ctrl + H,它顯示一個查找&替換彈出。在KeyDown中,ShowDialog使SuppressKeyPress不起作用

在我的窗體的KeyDown事件處理程序,我檢查了按Ctrl + H按鍵:

case Keys.H: 
    ShowFindReplaceDialog(true); // This line makes the SuppressKeyPress not work 
    e.SuppressKeyPress = true; 
    break; 

現在,按Ctrl + H是一個標準的鍵盤快捷鍵即相當於按退格,所以我需要壓制那。

問題是,顯示一個彈出導致抑制不起作用。所以彈出窗口顯示出來,關閉後我看到退格鍵(Ctrl + H)仍然出現。

這是如何工作的?

N.B.爲了完整起見,你用MessageBox遇到同樣的問題,它就是下面的所有ShowDialog。

回答

4

是的,那是因爲你調用ShowDialog()。這是一個阻塞調用,所以e.SuppressKeyPress語句不會被執行,直到之後關閉對話框。 ShowDialog抽取一個消息循環DoEvents樣式,因此按鍵消息按正常方式分派並觸發KeyPress事件。

最直接的解決方法是延遲顯示對話框,直到消息處理完成。典雅地用Control.BeginInvoke()完成,像這樣:

case Keys.H: 
    this.BeginInvoke(new Action(() => ShowFindReplaceDialog(true))); 
    e.SuppressKeyPress = true; 
    break; 
相關問題