【问题标题】:Filter control keys from KeyEventArgs从 KeyEventArgs 过滤控制键
【发布时间】:2019-11-21 23:38:02
【问题描述】:

我有一个小型事件处理程序来处理用户按下或条形码扫描仪提供的所有键:

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)
{
    _textRead.Append(e.Key);
}

private StringBuilder _textRead = new StringBuilder();


变量_textRead 应该收集所有按下的字符。我只对产生可打印输出的键感兴趣(a-z,0-9, !"§$%& 等等)。如果用户按下例如 Ctrl 这将添加字符串 LeftCtrl_textRead,所以我想跳过这个键。

如何优雅地过滤掉CtrlShiftAlt等控制键?强>

我知道我可以通过很多条件语句来实现这一点 (if e.Key == Key.Ctrl),但我希望找到更好的方法。

【问题讨论】:

  • 你能不能不检查它为char.IsNumberchar.IsLetter 只是将密钥转换为char 并且只允许两个条件
  • @V4Vendetta:但是如何将Key 枚举转换为char

标签: c# wpf


【解决方案1】:

试试这个:

using System;
using System.Text; 
using System.Windows.Input;

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)   
{  
    string keyPressed = _keyConv.ConvertToString(e.Key);

    if (keyPressed != null && keyPressed.Length == 1) 
    {
        if (char.IsLetterOrDigit(keyPressed[0]))
        {
            _textRead.Append(keyPressed[0]);
        }
    }
}

private StringBuilder _textRead = new StringBuilder();   
private KeyConverter _keyConv = new KeyConverter();

【讨论】:

  • 刚刚检查了有关此topic 的更多答案。这变得很复杂,我想我只是坚持你的解决方案。
【解决方案2】:

我偶然发现了 KeyEventArgs 过滤的这个问题。由于这在问题中很粗体,我想添加该问题的答案

过滤掉修饰符

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        var pressedModifiers = e.KeyboardDevice.Modifiers;
        if (pressedModifiers != ModifierKeys.None) return;

        //do your stuff
}

这会过滤掉Ctrl+a等组合

过滤掉特定的修饰符

public void KeyDownSink(object sender, System.Windows.Input.KeyEventArgs e)  {
        List<Key> ExitKeys = new List<Key> { Key.LeftCtrl, Key.RightCtrl, Key.LeftAlt, Key.RightAlt, Key.LeftShift, Key.RightShift };
        if (ExitKeys.contains(e.Key)) return;

        //do your stuff
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多