2011-09-06 491 views
11

我正在編寫自定義文本編輯器,並使用KeyDown和KeyUp事件。該事件從包含「Key」實例的參數中獲取KeyEventArgs。從密鑰獲取字符

我如何將這個「鑰匙」轉換成真正的字符?

使用帶有「。」的Key.ToString()我得到一個「OmePeriod」或「,」我得到一個「OmeComma」。我可以直接轉換這些值......但這是一項艱苦的工作,我相信必須存在任何將這些Keys轉換爲真正的「字符」的類。

謝謝!

問候。

+1

它已經討論http://stackoverflow.com/questions/7103360/how-to-get-pressed-char-from-system-windows-input-keyeventargs – Samich

+0

我認爲答案爲http:// stackoverflow.com/questions/544141/how-to-convert-a-character-in-to-equivalent-system-windows-input-key-enum-value問題可能會有幫助。 – Dmitriy

+0

可能重複[C#如何將虛擬鍵碼轉換爲char?](http://stackoverflow.com/questions/318777/c-sharp-how-to-translate-virtual-keycode-to-char) – bummi

回答

3

這裏的主要問題是你正在捕捉的事件是卷軸鍵盤事件,而且鍵確實是鍵而不是字符。在之間是鍵盤圖!例如,當鍵入shift-A時,您將收到兩個事件,而不是一個用於keypressed的事件。

這個討論可以幫助:C# How to translate virtual keycode to char?

3

使用KeyDown事件相反的,請嘗試使用TextInput事件。附加的事件處理程序看起來像這樣:

private void Grid_TextInput(object sender, TextCompositionEventArgs e) 
{ 
    Char keyChar = (Char)System.Text.Encoding.ASCII.GetBytes(e.Text)[0]; 
    Debug.WriteLine(keyChar); 
} 

注意,這僅僅抓住的第一個字節,而這不會對國際(Unicode)的文本。它可能不適用於更復雜的文本輸入事件,所以建議!

有關更多信息,請參閱this MSDN article

+0

有很多在wpf中捕獲textinput的問題,有些答案甚至涉及到系統dll。但你的答案是迄今爲止我所見過的最好的 – jflepp

-4

鑄e.KeyValue爲char。例如:

例如。

private void myTextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    char pressedCharacter = (char)e.KeyValue; 
} 
+0

沒有e.KeyValue – MSL

+0

這就是我追求我的目的。感謝您的有用答案! –

+0

我剛剛意識到這可能會返回不好的結果,可能根本不應該使用。當我使用這個時,我點擊了NumberPad 8鍵,它顯示爲KeyData和KeyCode,其鍵值爲104。另一方面,當使用'(char)e.KeyValue'時,值'104'轉換爲字符'h'而不是'8'! –