Сканер штрих-кода в режиме эмуляции клавиатуры в COM порт

Именно на этот вопрос я не нашел готового ответа. Считаю, что в десктопном режиме со сканером штрих-кодов (считывателем магнитных карт), необходимо работать исключительно напрямую. Windows Raw Input позволяет легко отследить нажатие клавиш, включая идентификацию с какой именно клавиатуры было нажатие, но не может “проглотить” ввод с определенной клавиатуры. Это можно сделать при помощи SetWindowsHookEx, но в нем нельзя определить с какой клавиатуры пришел символ.

У Атол решение на базе анализа всего трафика нажатий клавиш. Если “драйвер” увидел стартовый перфикс (F7 например), то он начинает все съедать до окончания штрих-кода по суффиксу или таймауту ввода. На мой взгляд это костыль.

Единственное вменяемое решение использование драйвера уровня ядра для прямого доступа к клавиатуре. Именно HID клавиатуре.

Для решения этой проблемы использован libusb – кроссплатформенная библиотека для работы с HID устройствами USB. Сценарий прост:

  1. Создаем пакет драйвера для HID устройства, работающего в режиме клавиатуры (inf-wizard.exe);
  2. Устанавливаем полученный драйвер для HID устройства и драйвер libusb;
  3. Начинаем прямую работу с HID устройством (например, используя LibUsbDotNet как я);

Придется освоить работу с USB и протокол работы клавиатуры, включая преобразование кодов клавиш в символы. Бонусом – перехват подключения/отключения любого USB оборудования, его быстрая готовность после подключения, кроссплатформенное решение и возможность использовать более дешевое оборудование (китайские сканеры от 15USD).

Теперь практика.

  1. Подключаемся к устройству и иницируем поток считывания:

2. Поток считывания данных будет выглядеть так:

При получении символа возврата каретки (Enter) буфер передается в события OnDataReceived(data) до этого символы копятся в буфере нажатых клавиш (buffer).

3. Пример  функции распознавания клавиш (делал под свои нужды, так что не полное):

Вполне достойная замена эмуляции COM порта. Все работает безупречно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.