WPF错误的KeyDown ASCII代码

我需要根据ASCII表获取键盘键的数值。由于WPF没有内置解决方案,我尝试了几种黑客攻击:

这个只给出大写的值。

char res ; Char.TryParse(e.Key.ToString(),out res); Debug.WriteLine((int)res); 

2即使它在许多地方被列为可能的解决方案,但这个数字完全错误。

  Debug.WriteLine(Convert.ToInt16(e.Key).ToString()); 

那么如何从WPF输入中获取大写和小写字母ASCII代码?

更新

在这里得到几个答案后,我想强调一下我的问题。我绝对必须从输入中得到ASCII代码,无论是大写还是大写。没有硬编码字符比较或类似的东西。我正在寻找更通用的方法。

根据这里提到的答案之一,我建议您使用TextInput (或PreviewTextInput )事件来获取按下的字母。 它应该为大写和小写字母提供正确的值。

为了测试它,您可以使用与此类似的代码:

 private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e) { Console.WriteLine(String.Format("letter: {0} (charcode: {1})", e.TextComposition.Text, (int)Convert.ToChar(e.TextComposition.Text))); } 

如果这有帮助,或者在使用此解决方案时遇到任何问题,请告诉我。

看看KeyEventUtility.GetCharFromKey(e.Key)

更新:抱歉这是我的一些库代码

  public static class KeyEventUtility { // ReSharper disable InconsistentNaming public enum MapType : uint { MAPVK_VK_TO_VSC = 0x0, MAPVK_VSC_TO_VK = 0x1, MAPVK_VK_TO_CHAR = 0x2, MAPVK_VSC_TO_VK_EX = 0x3, } // ReSharper restore InconsistentNaming [DllImport( "user32.dll" )] public static extern int ToUnicode( uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs( UnmanagedType.LPWStr, SizeParamIndex = 4 )] StringBuilder pwszBuff, int cchBuff, uint wFlags ); [DllImport( "user32.dll" )] public static extern bool GetKeyboardState( byte[] lpKeyState ); [DllImport( "user32.dll" )] public static extern uint MapVirtualKey( uint uCode, MapType uMapType ); public static char GetCharFromKey( Key key ) { char ch = ' '; int virtualKey = KeyInterop.VirtualKeyFromKey( key ); var keyboardState = new byte[256]; GetKeyboardState( keyboardState ); uint scanCode = MapVirtualKey( (uint)virtualKey, MapType.MAPVK_VK_TO_VSC ); var stringBuilder = new StringBuilder( 2 ); int result = ToUnicode( (uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0 ); switch ( result ) { case -1: break; case 0: break; case 1: { ch = stringBuilder[0]; break; } default: { ch = stringBuilder[0]; break; } } return ch; } 

这不是键盘的工作方式。 世界上的每台PC都有相同的键盘。 按一个键会生成一个虚拟键值 ,在世界上每个键盘上都是相同的值。 您在KeyDown事件中获得的e.Key值。

这是function键,光标键,Shift键等键的停止位置。 除非键是一个产生字符的输入键。 与字母A一样。在内部,KeyDown事件由Windows处理并转换为字符。 产生的实际字符取决于键盘布局。 不同国家/地区的用户具有不同的键盘布局,倾向于使用其语言中最常用的字形。 或者就此而言,用户的个人偏好,程序员经常喜欢Dvorak布局。

产生的角色还取决于键盘状态 。 与Shift键一样,按住它以产生A,而不是向下产生a。 这可能会在非英语键盘上变得非常复杂,其他布局也有死键 ,当按下时,它会改变下一次击键产生的角色。 有很多变音符号的语言使用它们。

这意味着很明显,翻译你从KeyDown事件中获得的虚拟密钥是一项非常危险的任务。 因此,您不应该尝试这样做。 而且您不必使用TextInput事件。

 if (e.Key == Key.A ) 

看看这个页面