我有一个带有数据网格的WPF窗口。我正试图从一个符号扫描器中捕捉一个通过虚拟楔子发送的字符串。对于应用程序来说,这些字符看起来都是输入的。此字符串以ASCII 1 (SOH)开头。
当窗口具有焦点时,窗口的PreviewTextInput将接收SOH以及所有其他可读的和非人类可读的值。但是,当数据集具有焦点时,非人类可读的字符就会被剥离掉.。
如果窗口上有一个PreviewKeyDown或PreviewKeyUp,那么不管焦点是什么,字符都会正确地出现。所以在这个过程中的某个地方,数据网格会把它去掉。不幸的是,由于KeyDown/KeyUp没有显示ASCII字符,所以如果不编写某种解析算法,我就不能使用这些事件。
有人能告诉我如何让那些非人类可读的控制字符总是被发送到PreviewTextInput吗?或者如何解析PreviewKeyDown中的所有字符?
编辑:
当窗口有焦点时:
Window PreviewKeyDown - LeftCtrl Window PreviewKeyDown - A Window PreviewTextInput - <SOH> Window PreviewKeyDown - Oem6 Window PreviewTextInput - ] Window PreviewKeyDown - LeftShift Window PreviewKeyDown - C Window PreviewTextInput - C
当数据网格具有焦点时:
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
发布于 2012-10-16 03:21:05
好的,我知道这可能不是你所期望的,但是我有一些为一些符号条形码扫描仪编写软件的经验。在一个应用程序中,我们让用户扫描他们的徽章以验证自己以覆盖某些条件。我们希望用户“扫描”他们的徽章,而不能用键盘输入数字。我记得我们花了很长时间试图弄清楚如何使输入不被输入,就像被键盘输入一样。我相信我们能够从符号条形码扫描仪的手册中扫描一些配置代码,将其配置为USB设备,我们可以打开和处理它的输入。这种方法对我们来说要好得多。
你考虑过尝试这样的东西吗?
在MSDN论坛上的这篇文章似乎是相关的( 将密钥转换为ASCII )
条形码阅读器通常可以在两种模式下工作。其中之一是它充当键盘楔子,产生按键,就像用户键入代码一样。另一个是应用程序直接接收扫描代码的地方,通常是通过串口。您已经将读取器切换到了一种模式,在这种模式下,它生成适合后一种方式的代码。Ctrl+B是一个控制代码,SOH (头的开始)。它用于与读取器同步程序,SOH表示扫描的开始,您可以使用它重置缓冲区索引。 您将希望为键盘楔形模式配置读取器,在这种模式下,它不会生成控制字符。如果有必要,仍然可以通过编写KeyDown事件处理程序(检测SOH )和KeyPressed事件处理程序(检测扫描代码)来使其工作。避免尝试将您在KeyDown中看到的键笔画转换为字符,KeyPressed已经为您完成了此操作。
我相信这可能会让你转换为ASCII:
[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)