我有一个条形码扫描器(它作为键盘),当然我也有一台连接到计算机的键盘。软件正在从扫描仪和键盘接受输入。我需要只接受扫描仪的输入。代码是用C#编写的。是否有一种方法可以“禁用”键盘输入,仅接受扫描仪输入?
注意: 键盘是笔记本电脑的一部分...所以无法拔掉。另外,我尝试了放置以下代码 protected override Boolean ProcessDialogKey(System.Windows.Forms.Keys keyData) { return true; } 但是除了忽略键盘击键之外,还会忽略条形码扫描仪的输入。
我不能让扫描仪发送哨兵字符,因为扫描仪正在被其他应用程序使用,添加哨兵字符流意味着修改其他代码。
此外,我不能使用定时方法来确定输入是否来自条形码扫描仪(如果是一堆字符后面跟着暂停),因为扫描的条形码可能是单个字符的条形码。
是的,我正在从数据流中读取数据。
我正在尝试跟随文章:在WinForms中区分条形码扫描仪和键盘。但我有以下问题:
- 我遇到了NativeMethods不可访问的错误。由于保护级别,似乎我需要导入dll;这是正确的吗?如果是,我该如何做?
- 应该使用哪个protected override void WndProc(ref Message m)定义,文章中有两个实现?
- 我遇到了与[SecurityPermission(SecurityAction.LinkDemand,Flags = SecurityPermissionFlag.UnmanagedCode)]相关的错误CS0246:找不到类型或命名空间“SecurityPermission”(是否缺少using指令或程序集引用?)。如何解决此错误?
- 在包含if ((from hardwareId in hardwareIds where deviceName.Contains(hardwareId) select hardwareId).Count() > 0) 的行上也会出现错误。错误是错误CS1026:)预期。
- 我应该将文章中的所有代码都放在一个名为BarcodeScannerListener.cs的.cs文件中吗?
关于Nicholas Piasecki在http://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/中发布的C#解决方案源代码的后续问题:
- 我无法在VS 2005中打开该解决方案,因此我下载了Visual C# 2008 Express Edition,并成功运行了代码。然而,在连接我的条形码扫描仪并扫描一维码后,程序无法识别扫描结果。我在OnBarcodeScanned方法中设置了一个断点,但从未被命中。我已经使用“设备管理器”获取了我的条形码扫描仪的id,并更改了App.config文件。似乎有2个具有HID#Vid_0536&Pid_01c1的deviceNames(这是当扫描仪连接时从“设备管理器”中获得的)。我不知道这是否导致扫描不起作用。在迭代deviceNames时,以下是我使用调试器找到的设备列表:
"\??\HID#Vid_0536&Pid_01c1&MI_01#9&25ca5370&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
"\??\HID#Vid_0536&Pid_01c1&MI_00#9&38e10b9&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID#Vid_413c&Pid_2101&MI_00#8&1966e83d&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID#Vid_413c&Pid_3012#7&960fae0&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
"\??\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\ACPI#PNP0303#4&2f94427b&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
"\??\ACPI#PNP0F13#4&2f94427b&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
这里有两个 HID#Vid_0536&Pid_01c1 的条目,这可能导致扫描不起作用?
好的,看起来我得想出一种不依赖于扫描器发送 ASCII 0x04 字符的方法……因为我的扫描器没有发送该字符。在那之后,条形码扫描事件被触发并且带有条形码的弹出窗口显示出来。所以谢谢 Nicholas 的帮助。