2015-09-16 51 views
0

我想知道爲什麼我的ProcessCmdKey觸發兩次,當我按下按鈕。這裏是我的代碼:ProcessCmdKey觸發兩次,WinForms

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發生衝突嗎?我從來沒有重寫默認的方法,但這次我被迫。

回答

1

我相信你ProcessCmdKey被髮射多次的原因是這樣的:

給ProcessCmdKey方法首先確定控件是否有一個ContextMenu,如果是這樣,可以使文本菜單處理命令鍵。如果命令鍵不是菜單快捷方式,並且控件具有父項,則該項將傳遞給父項的ProcessCmdKey方法。最終結果是命令鍵在控制層次上「冒泡」。除了用戶按下的按鍵之外,按鍵數據還指示哪個(如果有的話)修飾鍵與按鍵同時按下。修飾鍵包括SHIFT,CTRL和ALT鍵。

每MSDN:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.110).aspx

在你的方法有,我看你正在檢查的重點是其控制。所以這個方法是爲那個控件觸發的,然後是父控件(我認爲它是表單),因爲聚焦控件不太可能擁有快捷鍵或其他任何東西。

+0

太好了,謝謝!我只是覺得這是錯的。你知道是否有可能阻止這種淨效應?我的意思是如果我只想爲Focused控件觸發ProcessCmdKey事件,而不是將它傳遞給父項(您猜對的是表單)? –

+0

我認爲你只是想使用恰當的關鍵事件 – sab669

+0

雖然它們都在同一個組面板上,但對於TextBox雖然工作良好,但它正在被ComboBox調用兩次。任何想法如何解決它? – bjan