我正在尝试编写一个可以读取条形码扫描仪的程序。此外,即使应用程序不是焦点窗口(即在系统托盘中运行等),我也需要它来读取输入。
我发现这篇名为Distinguishing Barcode Scanners from the Keyboard in WinForms 的文章似乎解决了确切的问题。它工作得很好,它检测到我的设备并处理 WM_INPUT 消息。
但是,它正在检查 RAWINPUT.keyboard.Message 是否为 WM_KEYDOWN (0x100)。它似乎从来没有收到过这个。我在文章中提供的代码中更改的唯一代码行是添加一个 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 条码扫描仪,符号 LS2208,设置为“HID KEYBOARD EMULATION”