我有一个条形码扫描仪(它就像一个键盘),当然我的键盘也连接到了电脑上。该软件正在接受来自扫描仪和键盘的输入。我只需要接受扫描仪的输入。代码是用 C# 编写的。有没有办法“禁用”键盘输入并且只接受来自扫描仪的输入?
注意:键盘是笔记本电脑的一部分……因此无法拔下。另外,我尝试将以下代码保护覆盖 Boolean ProcessDialogKey(System.Windows.Forms.Keys keyData) { return true; 但是随着忽略键盘的击键,条形码扫描仪的输入也被忽略了。
我不能让扫描仪发送前哨字符,因为扫描仪正被其他应用程序使用,添加前哨字符流将意味着修改其他代码。
此外,我不能使用计时方法来确定输入是否来自条形码扫描仪(如果它是一堆字符,然后是暂停),因为扫描的条形码可能是单字符条形码。
是的,我正在从流中读取数据。
我正在尝试阅读文章:在 WinForms 中将条码扫描仪与键盘区分开来。但是我有以下问题:
- 我收到一个错误 NativeMethods 由于其保护级别而无法访问。好像我需要导入一个dll;它是否正确?如果是这样,我该怎么做?
- 我应该使用哪个受保护的覆盖 void WndProc(ref Message m) 定义,文章中有两种实现?
- 收到与 [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] 相关的错误错误 CS0246:找不到类型或命名空间名称“SecurityPermission”(您是否缺少 using 指令或程序集引用?)。如何解决此错误?
- 包含以下内容的行上还有一个错误:if ((from hardwareIds in hardwareIds where deviceName.Contains(hardwareId) select hardwareId).Count() > 0) Error is error 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 时,这里是我找到的设备列表(使用调试器):
“\??\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-00a?0c914dd50? \ACPI#PNP0303#4&2f94427b&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}" "\??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}" "\??\ACPI#PNP0F #4&2f94427b&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
所以 HID#Vid_0536&Pid_01c1 有 2 个条目;这会导致扫描不起作用吗?
好的,看来我必须想办法不依赖扫描仪发送的 ASCII 0x04 字符……因为我的扫描仪不发送该字符。之后,触发条形码扫描事件并显示带有条形码的弹出窗口。所以感谢尼古拉斯的帮助。