Стаття · · 5 хв читання

Як відрізнити сканер штрихкодів від людини за клавіатурою

Як невеликий інструмент для Windows рахує кожне сканування під час ревізії, не забираючи клавіші в облікової програми, використовуючи лише час між натисканнями.

Під час ревізії в УкрСкладі оператор пікає товар у документ, а програма показує суму в гривнях, а не кількість штук. Ніхто не знає, скільки одиниць у поточній коробці, а помилка означає перерахунок полиці. Облікову програму змінити не можна, тож я зробив лічильник, що працює поруч із нею.

Сканер — це просто швидка клавіатура

USB-сканер штрихкодів представляється системі як клавіатура. Він друкує цифри коду й натискає Enter. Тобто немає жодного API сканера — є лише введення з клавіатури, таке саме, як коли людина набирає пошуковий запит у тому самому вікні.

Слухати, а не забирати

Лічильник використовує низькорівневий хук клавіатури Windows. Він бачить кожну клавішу, але не забирає її, тож УкрСклад і далі отримує свої цифри й працює так само, як раніше. Забирає лічильник лише власні гарячі клавіші: F12 — нова партія, F9 — скасувати останній скан, F10 — експорт, F8 — пауза.

Увесь фокус — у часі

Сканер друкує весь код зі швидкістю 10–30 мілісекунд на клавішу й закінчує Enter. Людина рідко буває швидшою за приблизно 120 мілісекунд на клавішу. Тож правило просте: сканом рахується лише серія швидких натискань, що закінчується Enter.

# спрощено
if key == ENTER and len(buffer) >= MIN_DIGITS and max(gaps_ms) <= SCANNER_MAX_GAP:
    count(buffer)          # це скан
buffer.clear()             # усе повільніше — це людина набирала текст

Нічого не губиться

Кожен скан одразу дописується в журнал на диску, а кожні 20 сканів пишеться знімок. Якщо зникло світло чи ноутбук перезавантажився, наступний запуск повертає всі лічильники. Обнулення спершу робить експорт і архівує старий журнал — назовсім нічого не стирається.

Як повернути цифри назад

Наприкінці підрахунки йдуть в Excel і CSV зі штрихкодом, назвою й кількістю — у форматі, який УкрСклад імпортує штатним імпортом документа. Писати напряму в його базу я свідомо не став: це може порушити внутрішні регістри програми.

Обмеження, записане чесно

Правило залежить від швидкості набору. Сканер, налаштований надсилати клавіші повільно, не буде розпізнано, доки не змінити поріг у конфігурації, а консольний режим показує кожне натискання з часом, щоб це було легко зробити.

Проєкт, з якого ця стаття: Лічильник ревізії →

Схожа задача?

Напишіть, що ви будуєте і які дані маєте. Я відповім, як би це вирішував.

Обговорити проєкт →