Стояла следующая задача:
реализовать автоматическое сканирование при нажатии кнопки на сканере. Полученный материал должен попадать в сетевую папку и иметь уникальное имя. Сканер подключен к рабочей машине, все процедуры по сканированию не должны отвлекать человека работающего за этим компьютером под управлением Windows.
В Linux эта задача решается парой строк кода и замечательной утилитой Sane. C Windows дела обстоят гораздо сложнее. Стандартный софт сканера UMAX Astra 4700 подобных вещей вытворять не позволял. Поиск в интернете результатов не дал, но нашлись простые утилиты, позволяющие сканировать из командной строки, например iCopy, IrfanView. К сожалению ни одна из них не могла по тихому зарегистрироваться, как обработчик нажатия кнопки сканера и так же тихо провести сканирование в нужную папку. Натолкнувшись на описание, как зарегистрировать любое приложение в качестве обработчика событий со сканера решил написать небольшую программку на JavaScript, тем более, что написанный скрипт можно скомпилировать в исполняемый файл при помощи Jscript Compiler в составе .NET Framework. В качестве консольного сканера была выбрана немного глючная iCopy, которая не воспринимает некоторые ключи из командной строки, что впрочем решается костылем — созданием двух копий программы, правкой настроек прямо в конфиге и запуском нужной копии по каждой кнопке.
Скомпилировать скрипт проще простого, если у вас установлен .NET Framework, найдите приложение jsc.exe и выполните в командной строке:
Получим скомпилированное приложение scan.exe. Ключ "-reg" зарегистрирует программу в системе, как обработчик сообщений от кнопок сканера, ключ "-unreg" вернет все обратно. После регистрации в системе, необходимо перезагрузить Windows. Программа имеет конфигурационный файл, в котором можно сопоставить сообщения получаемые от обработчика нажатия кнопки с нужным приложением. Для более простой настройки есть режим логирования, чтоб не искать идентификаторы событий по всему реестру. После нажатия кнопки на сканере выбираем наше приложение, смотрим в лог и видим вторым параметром id события нажатия кнопки, его то и прописываем в конфигурационный файл.
Usage:
scan.exe -reg //регистрация программы в реестре
scan.exe -unreg //удаление информации о програме из реестра
scan.exe param1 param2 //запуск приложения в соответствии с param2
Конфигурационный файл (для моего сканера):
TODO:
реализовать автоматическое сканирование при нажатии кнопки на сканере. Полученный материал должен попадать в сетевую папку и иметь уникальное имя. Сканер подключен к рабочей машине, все процедуры по сканированию не должны отвлекать человека работающего за этим компьютером под управлением 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
Конфигурационный файл (для моего сканера):
- [debug]
- debugflag=true
- logfile=debug.log
-
- [flags]
- mail_flag=/StiEvent:{F61F8581-6105-11D6-AAF8-0050BA1ACA6F};
- scan_flag=/StiEvent:{F61F8582-6105-11D6-AAF8-0050BA1ACA6F};
- print_flag=/StiEvent:{F61F8583-6105-11D6-AAF8-0050BA1ACA6F};
-
- [applications]
- mail_app=
- scan_app="C:\Program Files\iCopy\iCopy.exe" /f:"\\server\scanned\$date$.jpg" /r:150
- print_app="C:\Program Files\iCopy\iCopy.exe" /c
Исходный кодTODO:
- Устранить потерю фокуса активного окна при запуске приложения.
Решено: параметр метода Run должен быть 6 - Избавиться от моргания консольного окна. Кто знает как, подскажите пожалуйста.
Решено: jsc.exe /target:winexe scan.js - Столкнулся с проблемой, если на некоторых машинах поставить крыжик «использовать это приложение по умолчанию» после выбора приложения для обработки кнопки, повторное нажатие на эту кнопку ни к чему не приводит, приложения не запускается, приходится лезть в свойства принтера и выставлять для кнопки «выбор приложения».
Решено: помог возврат статусов запуска служб Windows XP к стандартному. Критично чтобы сервис Windows Imaging Acquisition запускался автоматически, а не вручную.