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

от автора

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

image

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

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

На сегодняшний день сканер Canoscan LIDE 210 кажется хорошим выбором по своим характеристикам… некоторые интернет магазины в одноменном разделе в лидерах показывают именно его. Однако, цена немного выше собратьев. Работа от USB удобная вещь, и совсем не плохая скорость работы. Из минусов: плохая глубина резкости CIS матрицы на толстых книжках (в местах переплета возможно мыло, но кому оно сейчас нужно?). Софт.

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

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

image

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

Этот способ работает сразу после переподключения USB как я уже писал, но вы должны понимать, что при смене USB разъема на другой, вам придется повторять ваши действия. Ваши изменения привязанны к конретному USB разъему.
Ровно по этому, я считаю это хоть и вполне рабочем вариантом из-за простоты привязки к каждой кнопке своего приложения или ярлыка с параметрами какого-либо приложения ( CmdTwain способ для тех кто не кодит), но это не универсально и не true.

2) Ветка

Для разработчиков скорее будет вызывать интерес этот раздел. Он более логичен и правилен.

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

STIProxyEvent

Какие то Прокси Эвенты? Именно!
Раздел, созданный в этой директории, позволяет глобально быть доступным вашему приложению в окне выбора привязки событий на кнопки сканера. На сквозь.

Достаточно записи в этом разделе, и ваше приложение будет доступно для всех событий, а WIA драйвер сам передаст вашему приложению в виде двух параметров с какого устройства идет запрос и с какой кнопки. ( Вроде так))

Это работает глобально не зависимо от места USB подключения. Минус только один — чтобы измения вступили в силу, требуется перезагрузка.(поменяли путь к приложению? Аналогично — перезагрузка.)

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" 

Но я знаю, что есть какой то способ и без перезагрузки. Photoshop умеет это делать. (удаляем его ключ, ребут, в привязке событий на кнопки пусто, запускаем фотошоп, привязки появляются без перезагрузки, с создаваемым нами ключем так не проходит)
Рецепта реинициализации данной ветки для системы я не знаю. Потому просто перезагружаемся:

image

Итого.

Выпадающий список с приложениями для привязки к кнопкам сканера строится из этих 2-х веток (скорее всего есть еще какие то ветки, но меня они не заинтересовали).
Утилита для вызова сканирования через WIA пользуется профилем по умолчанию, который настраивается тут.

image

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

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

Утилита (win7-64 и win 8-64):
Открыть с помощью архиватора картинку или переименовать в zip

wia cat

ссылка на оригинал статьи http://habrahabr.ru/post/200528/