2

我正在尝试编写一个可以读取条形码扫描仪的程序。此外,即使应用程序不是焦点窗口(即在系统托盘中运行等),我也需要它来读取输入。

我发现这篇名为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”

4

3 回答 3

3

只是想补充一点,microsoft POS.net 是 microsoft 的一个免费库,用于构建服务点系统,它允许您读取最常见的条形码扫描仪,并在扫描条形码时为您提供一个事件。该库是免费的,并且得到很好的支持,并且可以与任何具有 OPOS 驱动程序的条形码扫描仪一起使用。

于 2010-06-13T22:12:04.230 回答
0

我突然想到,我真的不需要有问题的文章解决的解决方案。在阅读了几次之后,我意识到这是为了处理您无法设置扫描仪以使用前缀和后缀数据的情况。对我来说幸运的是,我可以做到这一点。

否则,我与文章的作者聊天,我们认为问题是因为我运行的是 Windows 64。我认为某些代码使用了不正确的数据类型,这可能导致 64 位错误地编组数据......我无法不过要验证这一点。

虽然在较低级别的 Windows 编程中是一个很好的练习。pinvoke.net上用于使用互操作的大量资源...

于 2010-05-27T15:10:39.350 回答
0

一种可以为您省去很多麻烦的非软件解决方案是为该扫描仪获取 RS-232 电缆,然后从 COM 端口读取数据。然后你就不需要关心哪个窗口或控件有焦点了。该特定扫描仪有一个 COM 端口仿真驱动程序,但它可能无法在 Windows 7 下运行。

于 2010-05-16T03:42:48.737 回答