我正在尝试编写一个可以读取条形码扫描器的程序。另外,即使应用程序不是焦点窗口(即在系统托盘中运行等),我也需要它来读取输入。
我发现这篇名为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条码扫描器,符号LS2208,设置为“HID键盘模拟”
答案 0 :(得分:3)
只是想补充一点,微软POS.net是一个免费的微软库,用于构建服务点系统,它允许您阅读最常见的条形码扫描仪,并在扫描条形码时为您提供事件。该库是免费的,并得到很好的支持,可与任何带有OPOS驱动程序的条形码扫描仪配合使用。
答案 1 :(得分:0)
一种可以为您节省更多恶化的非软件解决方案是为此扫描仪安装RS-232电缆,只需从COM端口读取。然后你不需要关心哪个窗口或控件有焦点。该特定扫描程序具有COM端口仿真驱动程序,但它可能无法在Windows 7下运行。
答案 2 :(得分:0)
在我看来,我真的不需要有问题的文章解决的解决方案。经过多次阅读后,我意识到它是为了处理你无法设置扫描仪使用前缀和后缀数据的情况。幸运的是,我能做到这一点。
否则,我与文章的作者聊天,我们认为问题是因为我运行的是Windows 64.我认为有些代码使用了错误的数据类型,这可能会导致64位错误地编组数据...我不知道虽然能够验证这一点。
虽然是低级别Windows编程的一个很好的练习。使用互操作的pinvoke.net资源很好......