2011-09-06 270 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'! –