Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2012, 21:09   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию User-mode драйвер / программа-фильтр для сканера штрих-кодов - какой правильный подход при разработке?

У меня сейчас стоит задача сделать некую программу или юзермодный драйвер если точнее, которая позволяла бы получать ивенты сканера и получать сами сканированные коды и при этом подавлять сами сообщения. В принципе на данный момент у меня уже что-то такое есть, но есть проблемы.

Я сделал пока так:
- Создал невидимое окно HWND_MESSAGE
- Зарегистрировал его как RawInput-приемник (RIDEV_INPUTSINK)
- Получаю WM_INPUT, фильтрую по hDevice
- Сам hDevice получаю из списка всех HID-устройств и Vendor ID и Product ID конкретного сканера (вот только не знаю VID&PID это сканера ли, или же это VID&PID порта или еще что-то такое, не проверял).

Проблемы у меня с этим такие:
- Нужно хранить список VID&PID для всех устройств, аналогичные юзермодные драйверы от производителей к таким вещам не привязаны
- Нет возможность подавить сами сообщения

На данный момент я вижу еще два способа реализации данной задачи:
1. Перевести сканер в режим эмуляции COM-порта, легко и трудно одновременно - сканер то не один будет, да и опять же остается проблема с VID&PID как я подозреваю. Неприемлемо в рамках ТЗ.
2. Подключить к стеку драйверов сканера свой драйвер-фильтр. Очень сложно и вообще я даже не знаю возможно ли это сделать, не зная VID&PID устройства, это конечно решит проблему

Вопросы у меня такие:
1. Как среди всех HID-устройств найти именно сканер? Есть ли у него какие-либо свойства доступные через WinAPI, которые бы явно указывали на то, что это сканер.
2. Какой подход могли использовать сами производители? Как лучше всего это реализовать? И самое главное как избавится от самих сообщений, как сделать чтобы они только в мою программу приходили?

Может быть кто-нибудь такое уже писал, поделитесь пожалуйста опытом и/или исходниками готовых решений?

P.S.: Под подавлением сообщений я имею в виду, чтобы моя программа становилась конечной точкой куда приходят эти сообщения клавиатуры/сканера, то есть чтобы я нажимал клавишу и данные о нажатии приходили только в мою программу. Сейчас получается я только получаю копию, а не единственный экземпляр - если при включенной программе поставить фокус на любое текстовое поле, то там все равно появятся циферки штрих-кода при сканировании.
P.P.S: Драйвер производителя с аналогичными функциями на целевой платформе не работает, потому сканер работает в режиме доп.клавиатуры - так все сканеры умеют судя по всему.
P.P.P.S: В гугле был, есть и буду
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 10.09.2012, 22:52   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

че-то, не совсем ясна задача. нужно ненавязчиво подсматривать штрих-коды, которые прочитал сканер, или просто работать со сканером?

если просто работать со сканером, то зачем все так усложнять?
перевести его в режим COM порта, и следить за буфером. можно конечно развлечь себя по теме PID/VID, но сканер понимает некий набор комманд, на которые он дает весьма предсказуемый ответ, что можно использовать для идентификации.


ььь... а производитель сканеров вообще не известен?

Последний раз редактировалось f.hump; 10.09.2012 в 23:02.
f.hump вне форума Ответить с цитированием
Старый 11.09.2012, 02:36   #3
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Zebex z-3152 - вот такой по моему. Задача простая. Получить все что считал сканер и сгенерировать ивент. При этом никакие символы в текущее выбранное текстовое поле дойти не должны и нужно сделать так чтобы это работало с любым подобным сканером, которые подключается в систему как клавиатура.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 11.09.2012, 10:32   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Я работал с HoneyWell 3800g, но у меня не было ограничения на клавиатуру, потому конфигурировал их в COM порт, когда во входящем буфере че-то появлялось, читал буфер и передавал на верх через callback. Для идентификации сканера использовал команду кортроля громкости пищалки: запрашивал текущий уровень громкости.

Не знаю на счет клавиатуры, но может он че-то типа WM_KEYDOWN/WM_KEYUP шлет, ну тогда поставить фильтр на эти сообщения в message loop, и передавать их дальше только при выполнении каких-то условий.
f.hump вне форума Ответить с цитированием
Старый 11.09.2012, 12:16   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...загляните в вашу же тему в другом месте, лень копипастить сюда.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для считывания штрих-кодов Alexx83 Фриланс 6 05.03.2012 20:29
DeviceIOControl в user-mode? chechestor Win Api 2 22.12.2010 11:51
Распознавание штрих-кодов vlad00777 Мультимедиа в Delphi 1 23.08.2010 21:45
Не могу найти драйвер для сканера Mustek BearPaw 1200CU Plus мотя Компьютерное железо 5 04.05.2010 12:49
Сканер штрих кодов asale Microsoft Office Excel 7 30.11.2008 19:57