【发布时间】:2009-02-25 21:04:44
【问题描述】:
我有一个条形码扫描仪(它就像一个键盘),当然我还有一个连接到计算机的键盘。该软件正在接受来自扫描仪和键盘的输入。我只需要接受扫描仪的输入。代码是用 C# 编写的。有没有办法“禁用”键盘输入,只接受来自扫描仪的输入?
注意: 键盘是笔记本电脑的一部分……所以它不能拔掉。另外,我尝试输入以下代码 protected override Boolean ProcessDialogKey(System.Windows.Forms.Keys keyData) { 返回真; } 但是随着忽略键盘的击键,条形码扫描仪的输入也被忽略了。
我不能让扫描仪发送标记字符,因为扫描仪正被其他应用程序使用,添加标记字符流意味着修改其他代码。
另外,我不能使用计时方法来确定输入是否来自条形码扫描仪(如果它是一堆字符,然后是暂停),因为扫描的条形码可能是单字符条形码。
是的,我正在从流中读取数据。
我正在尝试阅读文章:将条码扫描仪与 WinForms 中的键盘区分开来。但是我有以下问题:
- 我收到一个错误 NativeMethods 由于其保护级别而无法访问。好像我需要导入一个dll;它是否正确?如果是这样,我该怎么做?
- 我应该使用哪个protected override 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: ) expected.
- 我是否应该将文章中的所有代码放在一个名为 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-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 有 2 个条目;这会导致扫描无法工作吗?
好吧,看来我必须想办法不依赖扫描仪发送的 ASCII 0x04 字符……因为我的扫描仪不发送该字符。之后,触发条形码扫描事件并显示带有条形码的弹出窗口。所以感谢尼古拉斯的帮助。
【问题讨论】:
-
我在文章底部添加了一个示例代码发布。祝你好运!
-
@NicholasPiasecki 已经 6 年了,但仍然 - 为什么是 HTTP 410?
-
如果您的扫描仪支持 USB HID,您最好使用 Windows 10 中提供的新 API,禁用键盘模拟:github.com/Microsoft/Windows-universal-samples/tree/master/… ... 在旧版本上,您可以使用 SetupDi .. . 如果你必须使用键盘emu,你可以在archive.org找到它:web.archive.org/web/20150212020144/http://… ... HTTP 410意味着很多东西,包括“生命短暂”、“媒介已经过时”和“世界已满”混蛋”
-
@NicholasPiasecki,您或任何人能否分享 Nicholas Piasecki 的源代码。他的博客不工作了。我正在申请适用于 windows xp 的条码扫描器
-
@Qeeet,我也在寻找 Nicholas Piasecki 源代码。你找到了吗?
标签: c# barcode-scanner