Сканер штрих-кода USB и WM_KEYDOWN

Я пытаюсь написать программу, которая может считывать сканер штрих-кода. Кроме того, мне нужно, чтобы он читал ввод, даже если приложение не находится в фокусе окна (т.е. работает в системном трее и т. Д.).

Я нашел эту статью под названием Отличие сканеров штрих-кода от клавиатуры в 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-сканер штрих-кода, Symbol LS2208, настроенный как «ЭМУЛЯЦИЯ СПРЯТАННОЙ КЛАВИАТУРЫ»


person Bryce Fischer    schedule 15.05.2010    source источник


Ответы (3)


просто хотел добавить, что microsoft POS.net, бесплатная библиотека от Microsoft для создания систем точек обслуживания, позволяет считывать наиболее распространенные сканеры штрих-кода и выдает событие при сканировании штрих-кода. Библиотека бесплатна, хорошо поддерживается и работает с любым сканером штрих-кода, имеющим драйвер OPOS.

person Tom    schedule 13.06.2010
comment
Я погуглил и нашел этот codeproject.com/KB/miscctrl/posScanner.aspx . Может быть полезно. - person Nano HE; 17.09.2010

Одно непрограммное решение, которое могло бы избавить вас от многих неприятностей, - это получить кабель RS-232 для этого сканера и просто читать через COM-порт. Тогда вам не нужно будет заботиться о том, какое окно или элемент управления имеют фокус. В этом конкретном сканере есть драйвер эмуляции COM-порта, хотя он, вероятно, не будет работать под Windows 7.

person Tim Trout    schedule 16.05.2010
comment
Я попытался добавить ссылку на страницу загрузки драйвера, но она неправильно отформатировалась. Однако для Google это достаточно просто. - person Tim Trout; 16.05.2010
comment
Спасибо за комментарий Тим. Конечно, это был вариант, но мне пришлось использовать USB-соединение. Некоторые коллеги также предложили нечто подобное и написали для него драйвер ... Я не был готов отказаться от более простого решения и, к счастью, не отказался. - person Bryce Fischer; 27.05.2010

Мне пришло в голову, что мне действительно не нужно решение, которое решает данная статья. Прочитав несколько раз, я понял, что он предназначен для решения ситуации, когда вы не можете настроить сканер на использование данных префикса и суффикса. К счастью для меня, я могу это сделать.

В противном случае я побеседовал с автором статьи, и мы считаем, что проблема возникла из-за того, что я работал с Windows 64. Я думаю, что в некотором коде используются неправильные типы данных, из-за которых 64-битная версия может неправильно маршалировать данные ... Я не смог чтобы убедиться в этом.

Тем не менее, было отличным упражнением в программировании окон нижнего уровня. Отличный ресурс на pinvoke.net для использования прерываний ...

person Bryce Fischer    schedule 27.05.2010