首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataGrid PreviewTextInput事件从输入中删除控制字符

DataGrid PreviewTextInput事件从输入中删除控制字符
EN

Stack Overflow用户
提问于 2012-10-11 18:07:00
回答 1查看 809关注 0票数 5

我有一个带有数据网格的WPF窗口。我正试图从一个符号扫描器中捕捉一个通过虚拟楔子发送的字符串。对于应用程序来说,这些字符看起来都是输入的。此字符串以ASCII 1 (SOH)开头。

当窗口具有焦点时,窗口的PreviewTextInput将接收SOH以及所有其他可读的和非人类可读的值。但是,当数据集具有焦点时,非人类可读的字符就会被剥离掉.。

如果窗口上有一个PreviewKeyDown或PreviewKeyUp,那么不管焦点是什么,字符都会正确地出现。所以在这个过程中的某个地方,数据网格会把它去掉。不幸的是,由于KeyDown/KeyUp没有显示ASCII字符,所以如果不编写某种解析算法,我就不能使用这些事件。

有人能告诉我如何让那些非人类可读的控制字符总是被发送到PreviewTextInput吗?或者如何解析PreviewKeyDown中的所有字符?

编辑:

当窗口有焦点时:

代码语言:javascript
运行
复制
Window PreviewKeyDown - LeftCtrl
Window PreviewKeyDown - A
Window PreviewTextInput - <SOH>
Window PreviewKeyDown - Oem6
Window PreviewTextInput - ]
Window PreviewKeyDown - LeftShift
Window PreviewKeyDown - C
Window PreviewTextInput - C

当数据网格具有焦点时:

代码语言:javascript
运行
复制
Window PreviewKeyDown - LeftCtrl
DataGrid PreviewKeyDown - LeftCtrl
Window PreviewKeyDown - A
DataGrid PreviewKeyDown - A
Window PreviewKeyDown - Oem6
DataGrid PreviewKeyDown - Oem6
Window PreviewTextInput - ]
Window PreviewKeyDown - LeftShift
DataGrid PreviewKeyDown - LeftShift
Window PreviewKeyDown - C
DataGrid PreviewKeyDown - C
Window PreviewTextInput - C
EN

回答 1

Stack Overflow用户

发布于 2012-10-16 03:21:05

好的,我知道这可能不是你所期望的,但是我有一些为一些符号条形码扫描仪编写软件的经验。在一个应用程序中,我们让用户扫描他们的徽章以验证自己以覆盖某些条件。我们希望用户“扫描”他们的徽章,而不能用键盘输入数字。我记得我们花了很长时间试图弄清楚如何使输入不被输入,就像被键盘输入一样。我相信我们能够从符号条形码扫描仪的手册中扫描一些配置代码,将其配置为USB设备,我们可以打开和处理它的输入。这种方法对我们来说要好得多。

你考虑过尝试这样的东西吗?

在MSDN论坛上的这篇文章似乎是相关的(将密钥转换为ASCII )

条形码阅读器通常可以在两种模式下工作。其中之一是它充当键盘楔子,产生按键,就像用户键入代码一样。另一个是应用程序直接接收扫描代码的地方,通常是通过串口。您已经将读取器切换到了一种模式,在这种模式下,它生成适合后一种方式的代码。Ctrl+B是一个控制代码,SOH (头的开始)。它用于与读取器同步程序,SOH表示扫描的开始,您可以使用它重置缓冲区索引。 您将希望为键盘楔形模式配置读取器,在这种模式下,它不会生成控制字符。如果有必要,仍然可以通过编写KeyDown事件处理程序(检测SOH )和KeyPressed事件处理程序(检测扫描代码)来使其工作。避免尝试将您在KeyDown中看到的键笔画转换为字符,KeyPressed已经为您完成了此操作。

我相信这可能会让你转换为ASCII:

代码语言:javascript
运行
复制
[DllImport("user32.dll")]
    static extern int ToAsciiEx(uint uVirtKey, uint uScanCode, byte[] lpKeyState, byte[] arr, uint uFlags, IntPtr hkl);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetKeyboardState(byte[] lpKeyState);


    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        byte[] keyboardState = new byte[256];
        int keyCode = KeyInterop.VirtualKeyFromKey(e.Key);
        byte[] arr = new byte[4];
        GetKeyboardState(keyboardState );
        Debug.WriteLineIf(ToAsciiEx((uint)keyCode, 0, keyboardState, arr, 0, IntPtr.Zero) > 0, ASCIIEncoding.ASCII.GetString(arr));
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12845870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档