4

我需要根据ASCII 表获取键盘键的数值。由于 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 代码。没有硬编码的字符比较或类似的东西。我正在寻找更通用的方法。

4

4 回答 4

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;
    }
于 2013-02-11T22:04:09.760 回答
4

根据此处提到的答案之一,我建议您使用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)));
}

让我知道这是否有帮助,或者您在使用此解决方案时是否有任何问题。

于 2013-02-11T21:10:18.947 回答
4

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

这是功能键、光标键、Shift 键等键停止的地方。除非该键是产生字符的打字键。与字母 A 一样。在内部,KeyDown 事件由 Windows 处理并转换为字符。产生的实际字符取决于键盘布局。不同国家的用户有不同的键盘布局,偏爱在他们的语言中最常用的字形。或者就用户的个人喜好而言,程序员通常喜欢 Dvorak 布局。

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

含义很清楚,翻译从 KeyDown 事件中获得的虚拟键是一项非常危险的工作。因此,您不应尝试这样做。而且您不必使用 TextInput 事件。

于 2013-02-12T01:29:13.867 回答
0
if (e.Key == Key.A )

看看这个页面

于 2013-02-11T19:01:17.540 回答