【问题标题】:How do I get the normal characters from a WPF KeyDown event?如何从 WPF KeyDown 事件中获取正常字符?
【发布时间】:2010-10-03 23:15:36
【问题描述】:

我想要来自 WPF KeyDown 事件的 e.Key 属性传递的 ASCII 字符。

【问题讨论】:

    标签: c# wpf events keyboard


    【解决方案1】:

    您可以使用 TextInput 事件而不是 KeyDown 吗? TextCompositionEventArgs 类允许您直接检索通过 e.text 属性输入的文本

    private void UserControl_TextInput(
        object sender, 
        System.Windows.Input.TextCompositionEventArgs e)
    {
         var t = e.Text;
    }
    

    【讨论】:

    • 这很好用。它捕获任何按键或组合的值?其中; ie shift + i 将显示一个大写字母 I. 将 UserControl_TextInput 附加到主窗口构造函数中的 TextInput 事件并让你的叔叔鲍勃。即:this.TextInput += UserControl_TextInput; 在构造函数中(或在需要的地方)
    【解决方案2】:

    不幸的是,没有简单的方法可以做到这一点。有 2 种解决方法,但它们都在特定条件下失效。

    第一个是将其转换为字符串:

    TestLabel.Content = e.Key.ToString();
    

    这将为您提供 CapsLock 和 Shift 等内容,但是对于字母数字键,它无法告诉您当时的 shift 状态等,因此您必须自己想办法。

    第二种选择是使用 TextInput 事件,其中 e.Text 将包含实际输入的文本。这将为您提供字母数字键的正确字符,但不会为您提供控制字符。

    【讨论】:

    • Shift+2 应该是 @ 但会是 2!
    • 对于数字我得到“D3”而不是“3”
    • 我不知道谁赞成这个答案,但 D3 和 NumPad3 对我来说不是一个正常的字符
    【解决方案3】:

    根据您的简洁问题,我假设您需要一种方法来获取按下的键的 ASCII 值。这应该工作

    private void txtAttrName_KeyDown(object sender, KeyEventArgs e)
            {
                Console.WriteLine(e.Key.ToString());
                char parsedCharacter = ' ';
                if (Char.TryParse(e.Key.ToString(), out parsedCharacter))
                {
                    Console.WriteLine((int) parsedCharacter);
                }
            }
    

    例如如果按 Ctrl + S,您会看到以下输出。

    LeftCtrl
    S
    83
    

    【讨论】:

    • 这对于大量的键(数字、标点符号、小写键等)都失败了。
    【解决方案4】:
    System.Enum.ToObject(e.Key.GetType(), (byte)e.Key).ToString();
    

    【讨论】:

    • 所有这些都是为了得到与 e.Key.ToString() 相同的结果,但它仍然没有回答真正的问题
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多