我需要根据ASCII table获取键盘键的数值。由于WPF没有内置解决方案,我尝试了几种黑客攻击:
1。这个只给出大写值。
char res ;
Char.TryParse(e.Key.ToString(),out res);
Debug.WriteLine((int)res);
2 这个,即使它在很多地方被列为可能的解决方案,也会给出一个完全错误的数字。
Debug.WriteLine(Convert.ToInt16(e.Key).ToString());
那么如何从WPF输入中获取大写和小写字母ASCII代码?
更新
在这里得到几个答案之后我想强调一下我的问题。我绝对必须从输入中得到ASCII代码,无论是大写还是大写。没有硬编码字符比较或类似的东西。我正在寻找更通用的方法。< / p>
答案 0 :(得分:5)
查看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;
}
答案 1 :(得分:3)
根据here提到的答案之一,我建议您使用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)));
}
如果这有帮助,或者在使用此解决方案时遇到任何问题,请告诉我。
答案 2 :(得分:2)
这不是键盘的工作方式。世界上的每台PC都有相同的键盘。按键会生成虚拟键值,这个值在世界上的每个键盘上都是相同的值。您在KeyDown事件中获得的e.Key值。
这是功能键,光标键,Shift键等键的停止位置。除非键是一个产生字符的输入键。与字母A一样。在内部,KeyDown事件由Windows处理,翻译到字符。产生的实际字符取决于键盘布局。不同国家/地区的用户具有不同的键盘布局,有利于在其语言中最常使用的字形。或者就此而言,用户的个人偏好,程序员通常喜欢Dvorak布局。
产生的角色还取决于键盘状态。与Shift键一样,按住它以产生A,而不是向下产生a。这可以在非英语键盘上变得非常复杂,其他布局也有死键,当按下时,它会改变下一次击键产生的角色。有很多变音符号的语言使用它们。
含义很明确,翻译您从KeyDown事件中获得的虚拟密钥是非常危险的任务。因此,您不应该尝试这样做。而且您不必使用TextInput事件。
答案 3 :(得分:0)
if (e.Key == Key.A )
看看这个page