2013-09-24 35 views
3

我需要確定一個鍵在按下時是否會更改控件的文本;我需要忽略像Ctrl+ZEsc這樣的按鍵,但是如果文字改變,我需要知道哪個按鍵被按下。如果RichTextBox的文本不會改變,則忽略KeyDown

有沒有辦法知道,KeyDown事件?目前,我在KeyDown上設置了一個標記,並在TextChanged上進行了檢查,但我想知道是否有更好的方法?

+0

我不明白'你是否會改變控件的文本';'如果你的控件的文本改變了,'TextChanged'事件會得到它。 @Sriram在說什麼,尋找「IsControl」? – paqogomez

+0

是的......問題是我需要知道KeyDown,在TextChanged解決 – ferc

+1

之前我剛剛給出了一個提示。現在更新了我的答案。檢查是否可以幫助我 –

回答

4

您正在尋找Char.IsControl

private Keys lastKey = Keys.None; 
private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    lastKey = e.KeyData; 
} 

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (Char.IsControl(e.KeyChar)) 
    { 
     e.Handled = true;//prevent this key press 
     Keys pressedKey = this.lastKey; 
     //Do your stuff with pressedKey here 
    } 
} 
+0

我的想法正確+1 –

+0

@DROPtableusers當我提出'Char.IsControl'時,我得到了一個downvote。後來刪除.. :( –

1

你能趕上在文本框中KeyPress事件,如果它是一個有效的密鑰,您需要設置e.handled = false,如果它是一個糟糕的鑰匙,你會設置e.handled = true

例如來自:here

private void keypressed(Object o, KeyPressEventArgs e) 
    { 
     // The keypressed method uses the KeyChar property to check 
     // whether the ENTER key is pressed. 

     // If the ENTER key is pressed, the Handled property is set to true, 
     // to indicate the event is handled. 
     if (e.KeyChar == (char)Keys.Return) 
     { 
      e.Handled = true; 
     } 
    } 
+0

這將工作在WPF,但OP沒有給出任何跡象,那是什麼,他正在使用 – paqogomez

+0

確實...因爲我不知道任何關於WPF有時我忘記了這一事實,在那裏和很多人使用它...我的壞xD – ferc

+0

非常真實@paqogomez我假設你確定這不會與Windows窗體文本框? –

0

有一些按鍵,產生Control字符,但他們也改變了文本,例如BackSpace。他們有另一個難點:如果textbox爲空,按下它們(例如BackSpace)不會更改文本;所以它打破了以前的規則。所以Control字符並不天真地處理和建立規則。

此外,考慮Ctrl + CShift + Insert或類似的情況。 'C'鍵有點誘人;它就像是按'C'改變文字,但如果它被按下'Ctrl',它實際上並沒有改變文字。我們應該檢查Modifiers

也許你可以找到其他的困難來處理,我認爲flag方法已經足夠好了。