我正在尝试编写一个可以读取条形码扫描仪的程序。此外,即使应用程序不是焦点窗口(即在系统托盘中运行等),我也需要它来读取输入。
我找到了这篇文章,标题为 Distinguishing Barcode Scanners from the Keyboard in WinForms ,这似乎解决了确切的问题。它工作得很好,它检测我的设备并处理 WM_INPUT 消息。
但是,它正在检查 RAWINPUT.keyboard.Message 是否为 WM_KEYDOWN (0x100)。它似乎从来没有收到过这个。我在 article 中提供的代码中更改的唯一一行代码正在添加 Console.Out.WriteLine 来输出该消息的实际值:
Console.Out.WriteLine("message: {0}", raw.keyboard.Message.ToString("X"));
if (raw.keyboard.Message == NativeMethods.WM_KEYDOWN)
{
....
这是它的输出:
message: B
message: 1000B
message: 3
message: 10003
message: 8
message: 10008
message: 3
message: 10003
message: 5
message: 10005
message: 3
message: 10003
message: 8
message: 10008
message: 8
message: 10008
message: 4
message: 10004
message: 9
message: 10009
message: 9
message: 10009
message: 3
message: 10003
正确完成后我期望收到的值是:
257232709
我通过扫描到记事本进行了验证。
我不知道操作系统是否与这里相关,但我想我应该提到我在 Windows 7 64 和 Visual Studio 2010 以及 .NET Framework 3.5 中运行它。扫描仪是USB条码扫描仪,Symbol LS2208,设置为“HID KEYBOARD EMULATION”
最佳答案
只是想补充一点,microsoft POS.net,一个来自 Microsoft 的免费库,用于构建服务点系统,允许您读取最常见的条形码扫描仪,并在扫描条形码时为您提供一个事件。该库是免费的,并且得到了很好的支持,并且可以与任何具有 OPOS 驱动程序的条形码扫描仪配合使用。
关于c# - USB 条码扫描器和 WM_KEYDOWN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2841747/