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

Источник: habrahabr
Alexufo

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

image

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

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

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

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

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

Она написана на 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

Установка

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

UPDATE. 08.11.13

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

Читателем статьи и обладателем данного аппарата было предложено решение повторить идею через VBscript компилируемым в exe. pastebin.com/ce5d8yFi


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=35438