Как стать автором
Обновить

Как научить сканеры сканировать молча по кнопкам без окон и костылей?

Время на прочтение6 мин
Количество просмотров143K
Как заставить сканеры вообще (речь пойдет про Canoscan LIDE 210) молчаливо по кнопке сканировать файл с нужными параметрами в требуемую папку?

image


По-моему, это самая распространенная задача и для ее решения производитель нам дает самые нераспространенные решения.
В следующих версиях производители ну наверняка добавят в свой софт что-то вроде «отправить скан в facebook» или «поделиться в Twitter» но чтобы сделать тихий режим, настроить раз и сканировать без каких либо окон… до этого мы не доживем.

В конце статьи готовая утилита, позволяющая производить сканирование с любой кнопки любого сканера в любую папку без какого либо проявления на экране. А теперь начнем с того, каким же образом это удалось реализовать…

Без родного софта, кнопки Canoscan LIDE 210 работать не хотят. А с родным — вызывают жуткое негодование. Невозможно сканировать по кнопкам без открытия родного приложения. Поменять бы софт, да нету ничего. Секретаршам из-за полученного стресса приходится смотреть на кошек из-за этого на 5% больше времени, может быть поэтому они так популярны?(кошки)). Я сталкивался с этой проблемой три года назад в предыдущей модели сканера, я столкнулся с этой проблемой сегодня. Я читал комментарии многих людей выбешенных этой проблемой.

У нас есть в офисе паспортный сканер формата А5 Plusteck 550, он правда раза в три дороже, но его софт умеет молча с кнопок делать то, что указано в их настройках. Слава богу, что почти все сканнеры давно и поголовно поддерживают стандарты TWAIN и WIA. Это значит, что в семействе windows они должны работать без своего софта и вообще без установки каких либо драйверов производителя.

Можем снести при желании весь стандартный софт. Мы будем работать через собственное безоконное приложение через WIA (качайте CmdTwain или в конце статьи наша утилита).

Способ 1 больше теории. Я рекомендую все же способ 2

Она написана на c# из-за количества готовых примеров. Работает очень просто:

  • По старту ищет первый сканер в системе
  • Сохраняет скан в директорию, адрес которой передан параметром.
  • Позволяет себя назначать на любую кнопку сканера через стандартный виндовый интерфейс


С двумя первыми пунктами понятно, а третий мы как раз рассмотрим в этой статье. С рабочего стола утилита работает отлично. Запускаем, она ищет сканер, и делает скан в папку, которую указали параметром при запуске. Но нам нужно добиться, чтобы она вызывалась по кнопке со сканера, а не по щелчку с рабочего стола. Лучше всего ее поместить каким-то образом вот в это окно:

image

Сказать честно, информации об этом довольно мало, гугл не открыл мне Америки как и 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 порт первый раз, создается папка со следующим порядковым номером и вложенной иерархией присущей подключаемому типу устройства. У разных сканеров по разному могут называться разделы.

image

При подключении Canoscan LIDE 210 создалась директория 0014 с двумя подпапками DeviceData и Events. Если ваш сканнер поддерживает 5 кнопок, в папке Events вы увидите каждую из них даже с описанием действия в значениях ключей. (однако не все так логично, об этом ниже)

Если вы подключили сканер первый раз по этому USB, то в разделах PushButtonPushed у вас будет пусто. В противном случае вы обнаружите папки с именами в виде GUID и ключами с описанием привязанного программного обеспечения, ссылки на исполняемый файл тп.
Эта папка есть назначенное событие через виндовый интерфейс в свойствах сканера. Удалите папки GIUD ключами, сбросится привязка. Удалять их можно без проблем.

А вот удалять сами папки 0014 ни в коем случае нельзя. Они не восстанавливаются даже при накате офиц драйверов и с wia больше работать не будут. Проверено

image

Именно эту папку вы можете повторить самостоятельно изменив 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"


image

Изменения в систему вступят в силу после переподключения USB разъема.

Project1.exe приложение выводящие параметры %1 и %2
Теперь мы можем полюбоваться, что в окне привязки событий к кнопкам появилось наше тестовое приложение:

wia

Однако, мне не понятен тот факт, что хоть в реестре мы создали папку с путем до запуска нашего приложения, в корне родителя которого указано «Кнопка для посылки по емейл» в виндовом окне привязки кнопок наше приложение доступно по другому событию. Почему так… я до конца не выяснил.

По нажатию на кнопку сканера мы видим наше консольное приложение выводящее параметры. Ура.
wia

Способ 2



HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\StillImage\Events\STIProxyEvent\


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"


image

Как вы видите на картинке выше, мы можем повесить на любую клавишу нашу утилиту, которая прекрасно отрабатывает.

Назначение события — это просто копия директории из STIProxyEvent в соотвествующую папку PushButtonPushed описанной в первом случае.

Итого.



  • Вы должны понимать, что при смене USB разъема на другой, вам придется повторять привязку событий к кнопкам. Это не недоработка, это так работает даже и у официальных продуктов. Поменял разъем — настрой кнопки.
  • Ветка реестра STIProxyEvent нужна только как мастер. В момент назначения кнопкам приложений WIA копирует раздел с ветки EventProxy в нужную папку события кнопки сканера.
  • В свойствах сканирования, в событиях, выпадающий список с приложениями для привязки к кнопкам сканера строится из 2-х веток, с STIProxyEvent и всех папок PushButtonPushed находящихся в родительской директории.
  • Настройки яркости, dpi и прочего настраивать через утилиту не нужно. Она пользуется профилем по умолчанию, который настраивается тут.

image

Наверное, это все. С другими сканерами думаю будет все аналогично ибо — wia. Удалять стандартный софт не обязательно.
И еще, дублировать ветки реестра для 64 битных систем нет необходимости. Они каким то образом сами это делают — удобно)

Приятно, когда такую неразбериху, можно так аккуратно разрулить.

Утилита (win7-64 и win 8-64):
Открыть с помощью архиватора(7zip и др.) картинку или переименовать в zip
Установка
1)Распаковать архив в нужное место (к примеру C:\wiatest)

2) Запустить через cmd.exe
«C:\wiatest\WIATest.exe reg C:\1221»

Где
reg — сделать запись в реестре. (Это второй пункт статьи),
а второй параметр «C:\1221» — желаемый путь сохранения ваших сканов.

3)Перезагрузиться и назначить нужную кнопку сканера в Панель управления -> устройства и принтеры-> правой кнопкой по сканеру -> свойства сканирования -> События на «4 cats». Теперь эта кнопка на сканере будет сохранять сканы в «C:\1221».

Можете сделать ярлык просто с одним параметром «C:\wiatest\WIATest.exe C:\1221» тогда утилита просто будет сканировать в папку «C:\1221» или в любую другую.


Пока не доступно для скачивания. Есть бага.

UPDATE. 08.11.13

1) Canon mp280 по отзывам изначально как-то криво работает через мастер изображений. Сканирует только 1/4 формата А4 при прописанном жестко где только можно формате А4. Говорят этот баг лечится обновлением драйверов.

Читателем статьи и обладателем данного аппарата было предложено решение повторить идею через VBscript компилируемым в exe. pastebin.com/ce5d8yFi
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+27
Комментарии45

Публикации

Истории

Работа

Ближайшие события