Стаття · · 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 зі штрихкодом, назвою й кількістю — у форматі, який УкрСклад імпортує штатним імпортом документа. Писати напряму в його базу я свідомо не став: це може порушити внутрішні регістри програми.
Обмеження, записане чесно
Правило залежить від швидкості набору. Сканер, налаштований надсилати клавіші повільно, не буде розпізнано, доки не змінити поріг у конфігурації, а консольний режим показує кожне натискання з часом, щоб це було легко зробити.