将PreviewKeyDown中接收到的按键转换为字符串

3
我正在使用窗口上的PreviewKeyDown事件来接收来自条形码扫描器的所有按键。KeyEventArgs是一个枚举,而不是给出实际字符串。我不想使用TextInput,因为有些键可能被控件本身处理,可能不会冒泡到TextInput事件。
我正在寻找一种将我在PreviewKeyDown中获得的键转换为实际字符串的方法。 我查看了InputManager、TextCompositionManager等,但我没有找到一种方法,可以让我给出键列表,然后返回一个字符串。 TextCompositionManager或其他某些东西必须将这些键转换为字符串,这就是TextInput中可用的内容。
2个回答

2

这里是我使用的事件。KeyDown获取按键,PreviewTextInput获取实际文本。因此,在按键和文本之间,按键被转换为文本。

 public Window1()
            {
                InitializeComponent();
                TextCompositionManager.AddPreviewTextInputStartHandler(this, new TextCompositionEventHandler(Window_PreviewTextInput));
                this.AddHandler(Window.KeyDownEvent, new System.Windows.Input.KeyEventHandler(Window_KeyDown), true);
            }

    private void Window_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
            }

    private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
            {
            }

.NET框架在KeyUp/KeyDown事件中返回原始扫描码似乎是“不可能的”(就像“太令人震惊而无法相信”)。那么我们该怎么办呢?改用PreviewTextInput事件。我们可以像这样获取按下键的字符串表示形式:void KeyboardNavigation(object sender, TextCompositionEventArgs e) { string typedChar = e.Text; } - Helge Klein

1

键盘 -> 文本转换比你想象的要复杂得多,实际上没有办法将一个按键映射到一个字符,因为在某些语言和某些情况下,你需要多次按键才能组成一个字符。

由于您有兴趣从条形码扫描器获取输入(我假设只会生成 Windows 可处理的一小部分,可能只有 ASCII,甚至更少),因此您可以自己构建转换表并将其硬编码到程序中 - 这比处理 Windows 文本处理所做的所有疯狂要容易得多(如果想了解乐趣,请查找“死键”)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接