Как научить сканеры сканировать молча по кнопкам без окон и костылей?
Как заставить сканеры вообще (речь пойдет про Canoscan LIDE 210) молчаливо по кнопке сканировать файл с нужными параметрами в требуемую папку?
По-моему, это самая распространенная задача и для ее решения производитель нам дает самые нераспространенные решения.
В следующих версиях производители ну наверняка добавят в свой софт что-то вроде «отправить скан в facebook» или «поделиться в Twitter» но чтобы сделать тихий режим, настроить раз и сканировать без каких либо окон… до этого мы не доживем.
В конце статьи готовая утилита, позволяющая производить сканирование с любой кнопки любого сканера в любую папку без какого либо проявления на экране. А теперь начнем с того, каким же образом это удалось реализовать…
Без родного софта, кнопки Canoscan LIDE 210 работать не хотят. А с родным — вызывают жуткое негодование. Невозможно сканировать по кнопкам без открытия родного приложения. Поменять бы софт, да нету ничего. Секретаршам из-за полученного стресса приходится смотреть на кошек из-за этого на 5% больше времени, может быть поэтому они так популярны?(кошки)). Я сталкивался с этой проблемой три года назад в предыдущей модели сканера, я столкнулся с этой проблемой сегодня. Я читал комментарии многих людей выбешенных этой проблемой.
У нас есть в офисе паспортный сканер формата А5 Plusteck 550, он правда раза в три дороже, но его софт умеет молча с кнопок делать то, что указано в их настройках. Слава богу, что почти все сканнеры давно и поголовно поддерживают стандарты TWAIN и WIA. Это значит, что в семействе windows они должны работать без своего софта и вообще без установки каких либо драйверов производителя.
Можем снести при желании весь стандартный софт. Мы будем работать через собственное безоконное приложение через WIA (качайте CmdTwainили в конце статьи наша утилита).
Способ 1 больше теории. Я рекомендую все же способ 2
Она написана на c# из-за количества готовых примеров. Работает очень просто:
- По старту ищет первый сканер в системе
- Сохраняет скан в директорию, адрес которой передан параметром.
- Позволяет себя назначать на любую кнопку сканера через стандартный виндовый интерфейс
С двумя первыми пунктами понятно, а третий мы как раз рассмотрим в этой статье. С рабочего стола утилита работает отлично. Запускаем, она ищет сканер, и делает скан в папку, которую указали параметром при запуске. Но нам нужно добиться, чтобы она вызывалась по кнопке со сканера, а не по щелчку с рабочего стола. Лучше всего ее поместить каким-то образом вот в это окно:
Сказать честно, информации об этом довольно мало, гугл не открыл мне Америки как и msdn. Есть несколько источников (привет icopy), но они не рабочие… Но каким то образом производитель Canon (в данном случае приложения «MP Navigator EX 4.0», а на скриншоте выше «Photoshop») умудрился это сделать и мы попробуем узнать как.
Поиск решения
Все нужные записи хранятся в реестре(ну а где еще?) и для поиска изменений мы воспользуемся бесплатным приложением Regshot (http://sourceforge.net/projects/regshot/). Оно позволяет снять два снапшота реестра и показать изменения.
Сделаем снимок реестра до установки MP Navigator EX 4.0 и после, а результат сравнения сохраним в html файл для анализа.
Я не буду приводить весь лог, который мы получили. Из него для нас оказалось интересным два ключа в реестре.
Способ 1.
HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\
Данная ветка отвечает за сканеры и вебкамеры. Она содержит в себе в виде папок ваши USB подключения устройств съема изображений.
Если устройство подключается на какой либо USB порт первый раз, создается папка со следующим порядковым номером и вложенной иерархией присущей подключаемому типу устройства. У разных сканеров по разному могут называться разделы.
При подключении Canoscan LIDE 210 создалась директория 0014 с двумя подпапками DeviceData и Events. Если ваш сканнер поддерживает 5 кнопок, в папке Events вы увидите каждую из них даже с описанием действия в значениях ключей. (однако не все так логично, об этом ниже)
Если вы подключили сканер первый раз по этому USB, то в разделах PushButtonPushed у вас будет пусто. В противном случае вы обнаружите папки с именами в виде GUID и ключами с описанием привязанного программного обеспечения, ссылки на исполняемый файл тп.
Эта папка есть назначенное событие через виндовый интерфейс в свойствах сканера. Удалите папки GIUD ключами, сбросится привязка. Удалять их можно без проблем.
А вот удалять сами папки 0014 ни в коем случае нельзя. Они не восстанавливаются даже при накате офиц драйверов и с wia больше работать не будут. Проверено
Именно эту папку вы можете повторить самостоятельно изменив GUID раздела и путь к исполняемому файлу. Логика подобия здесь работает. Только GUID придумайте уникальный.
Примерно так:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0014\Events\PushButtonPushed1\{9927FCDF-2047-4571-B318-762646A98111}]
"Name"="Notepad salo"
"Desc"="Notepad"
"Icon"="sti.dll,0"
"Cmdline"="C:\\Project1.exe /StiDevice:%1 /StiEvent:%2"
Изменения в систему вступят в силу после переподключения USB разъема.
Project1.exe приложение выводящие параметры %1 и %2
Теперь мы можем полюбоваться, что в окне привязки событий к кнопкам появилось наше тестовое приложение:
Однако, мне не понятен тот факт, что хоть в реестре мы создали папку с путем до запуска нашего приложения, в корне родителя которого указано «Кнопка для посылки по емейл» в виндовом окне привязки кнопок наше приложение доступно по другому событию. Почему так… я до конца не выяснил.
По нажатию на кнопку сканера мы видим наше консольное приложение выводящее параметры. Ура.
Способ 2
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\StillImage\Events\STIProxyEvent\
Какие то Прокси Эвенты?
Раздел, созданный в этой директории, позволяет глобально быть доступным вашему приложению в свойствах сканирования для привязки к кнопкам. Он позволяет назначать событие на текущий подключенный сканер через виндовый интерфейс.
В первом случае вы должны будете сами догадаться на какой папке (0014 в нашем случае) висит ваш сканер.
Достаточно записи в этом разделе, и ваше приложение будет доступно для всех событий, а при привязки WIA драйвер сделает копию из STIProxyEvent к нужной кнопке сканера.
Чтобы изменения вступили в силу, требуется перезагрузка.(поменяли путь к приложению? Аналогично — перезагрузка.) Или рестарт службы WIA.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\StillImage\Events\STIProxyEvent\{9927FCDF-2047-4571-B318-762646A98111}]
"Name"=""
"Desc"=""
"Icon"="sti.dll,0"
"Cmdline"=" C:\\twia\\WIATest.exe C:\\scans"
Как вы видите на картинке выше, мы можем повесить на любую клавишу нашу утилиту, которая прекрасно отрабатывает.
Назначение события — это просто копия директории из STIProxyEvent в соотвествующую папку PushButtonPushed описанной в первом случае.
Итого.
- Вы должны понимать, что при смене USB разъема на другой, вам придется повторять привязку событий к кнопкам. Это не недоработка, это так работает даже и у официальных продуктов. Поменял разъем — настрой кнопки.
- Ветка реестра STIProxyEvent нужна только как мастер. В момент назначения кнопкам приложений WIA копирует раздел с ветки EventProxy в нужную папку события кнопки сканера.
- В свойствах сканирования, в событиях, выпадающий список с приложениями для привязки к кнопкам сканера строится из 2-х веток, с STIProxyEvent и всех папок PushButtonPushed находящихся в родительской директории.
- Настройки яркости, dpi и прочего настраивать через утилиту не нужно. Она пользуется профилем по умолчанию, который настраивается тут.
Наверное, это все. С другими сканерами думаю будет все аналогично ибо — wia. Удалять стандартный софт не обязательно.
И еще, дублировать ветки реестра для 64 битных систем нет необходимости. Они каким то образом сами это делают — удобно)
Приятно, когда такую неразбериху, можно так аккуратно разрулить.
Утилита (win7-64 и win 8-64):
Открыть с помощью архиватора(7zip и др.) картинку или переименовать в zipУстановка
Пока не доступно для скачивания. Есть бага.
UPDATE. 08.11.13
1) Canon mp280 по отзывам изначально как-то криво работает через мастер изображений. Сканирует только 1/4 формата А4 при прописанном жестко где только можно формате А4. Говорят этот баг лечится обновлением драйверов.
Читателем статьи и обладателем данного аппарата было предложено решение повторить идею через VBscript компилируемым в exe. pastebin.com/ce5d8yFi