Pull to refresh

Автоматическое сканирование в сетевую папку по нажатию кнопки «Scan»

Reading time 3 min
Views 52K
Стояла следующая задача:
реализовать автоматическое сканирование при нажатии кнопки на сканере. Полученный материал должен попадать в сетевую папку и иметь уникальное имя. Сканер подключен к рабочей машине, все процедуры по сканированию не должны отвлекать человека работающего за этим компьютером под управлением Windows.

В Linux эта задача решается парой строк кода и замечательной утилитой Sane. C Windows дела обстоят гораздо сложнее. Стандартный софт сканера UMAX Astra 4700 подобных вещей вытворять не позволял. Поиск в интернете результатов не дал, но нашлись простые утилиты, позволяющие сканировать из командной строки, например iCopy, IrfanView. К сожалению ни одна из них не могла по тихому зарегистрироваться, как обработчик нажатия кнопки сканера и так же тихо провести сканирование в нужную папку. Натолкнувшись на описание, как зарегистрировать любое приложение в качестве обработчика событий со сканера решил написать небольшую программку на JavaScript, тем более, что написанный скрипт можно скомпилировать в исполняемый файл при помощи Jscript Compiler в составе .NET Framework. В качестве консольного сканера была выбрана немного глючная iCopy, которая не воспринимает некоторые ключи из командной строки, что впрочем решается костылем — созданием двух копий программы, правкой настроек прямо в конфиге и запуском нужной копии по каждой кнопке.

Скомпилировать скрипт проще простого, если у вас установлен .NET Framework, найдите приложение jsc.exe и выполните в командной строке:

jsc.exe /target:winexe scan.js

Получим скомпилированное приложение scan.exe. Ключ "-reg" зарегистрирует программу в системе, как обработчик сообщений от кнопок сканера, ключ "-unreg" вернет все обратно. После регистрации в системе, необходимо перезагрузить Windows. Программа имеет конфигурационный файл, в котором можно сопоставить сообщения получаемые от обработчика нажатия кнопки с нужным приложением. Для более простой настройки есть режим логирования, чтоб не искать идентификаторы событий по всему реестру. После нажатия кнопки на сканере выбираем наше приложение, смотрим в лог и видим вторым параметром id события нажатия кнопки, его то и прописываем в конфигурационный файл.

Usage:
scan.exe -reg //регистрация программы в реестре
scan.exe -unreg //удаление информации о програме из реестра
scan.exe param1 param2 //запуск приложения в соответствии с param2

Конфигурационный файл (для моего сканера):
  1. [debug]
  2. debugflag=true
  3. logfile=debug.log
  4.  
  5. [flags]
  6. mail_flag=/StiEvent:{F61F8581-6105-11D6-AAF8-0050BA1ACA6F};
  7. scan_flag=/StiEvent:{F61F8582-6105-11D6-AAF8-0050BA1ACA6F};
  8. print_flag=/StiEvent:{F61F8583-6105-11D6-AAF8-0050BA1ACA6F};
  9.  
  10. [applications]
  11. mail_app=
  12. scan_app="C:\Program Files\iCopy\iCopy.exe" /f:"\\server\scanned\$date$.jpg" /r:150
  13. print_app="C:\Program Files\iCopy\iCopy.exe" /c
Исходный код

TODO:
  • Устранить потерю фокуса активного окна при запуске приложения.
    Решено: параметр метода Run должен быть 6
  • Избавиться от моргания консольного окна. Кто знает как, подскажите пожалуйста.
    Решено: jsc.exe /target:winexe scan.js
  • Столкнулся с проблемой, если на некоторых машинах поставить крыжик «использовать это приложение по умолчанию» после выбора приложения для обработки кнопки, повторное нажатие на эту кнопку ни к чему не приводит, приложения не запускается, приходится лезть в свойства принтера и выставлять для кнопки «выбор приложения».
    Решено: помог возврат статусов запуска служб Windows XP к стандартному. Критично чтобы сервис Windows Imaging Acquisition запускался автоматически, а не вручную.
Скачать архив с программой
Tags:
Hubs:
+40
Comments 51
Comments Comments 51

Articles