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

    Как заставить сканеры вообще (речь пойдет про 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
    Поддержать автора
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 45

      +2
      Может это какой-то неведомый мне сленг, но слово «кАстылей» в заголовке очень режет глаза
        0
        Сленг, не сленг но соглашусь — лучше по вашему.
        +1
        Сказать честно, информации об этом довольно мало, гугл не открыл мне Америки как и msdn.
        Первая ссылка в гугле по первому пришедшему в голову запросу (scan event handler site:microsoft.com). У персонажа получилось только с HP ScanJet 6300C, ключевые слова в виде WIA COM там есть. Как можно было гуглить и не найти информации, не особо ясно, видимо, у меня какой-то другой гугль.
          +1
          Это я видел. Там описан вариант отдельно запущенного процесса, который регистрирует себя на кнопки пока висит в памяти. К тому же, по описанной документации работают только два события: на коннект и дисконект. На остальные сканер никак не реагирует вообще. Эту же проблему кто-то описывал в сети тоже.
          EventID полностью сопадают со значениями в реестре как и в msdn, но абсолютно никак не реагируют(
            +1
            А… написано по той же ссылке в комментариях:
            «First two events work — both start dm_OnEvent; event for button was pressed dont work.» Тоже самое и у нас. Но нас изначально висячий процесс не устраивал. Зачем он нужен.
          0
          Как же много сложного надо сделать, чтобы сделать просто.

          А вообще статья напомнила мне недавно прочитанную книгу Психбольница в руках пациентов. В ней Алан Купер не обошел вниманием тему «софта для железа»
            0
            Это очень просто как оказалось. Я просто расписал этапы что я узнал и выложил информацию об этом.

            Нужно всего то создать ключ в реестре с адресом вашего приложения и перезагрузится. Потом назначить на кнопку приложение и все, оно работает. А книгу эту давно лет 5 назад читал.
            0
            Картинка доказывает, что на habrastorage можно успешно выкладывать PNGZIP.

            Это полезно.
              0
              Но не очень удобно. win8 стандартный архиватор отказывается открывать.
                0
                Shift+R.Click = Открыть с помощью
                не помогает?
                  0
                  Стандартнй архиватор от винды 8 не хочет читать файл этот. Как мышкой этот файл не подтолкни архиватору)
              0
              > Утилита для вызова сканирования через WIA пользуется профилем по умолчанию, который настраивается тут.
              Этот апп начинает процесс сканирования, я правильно понял?
              А потом другому аппу через настройки в реестре передаются данные?
              Туплю.
                +1
                Утилита находит первый сканер в системе, просит его сделать скан, положив его по адресу прописанному параметром. (Тоже самое что cmdtwain) Скан делается с профилем, который в системе установлен по умолчанию.( Умолчания это 300 точек, яркость контрастность по 0. )

                Менять профиль можно там, где я показал на картинке. (ну малоли кому там нужно 150 точек и по ярче?) Это все виндовые возможности из коробки.
                Реестр юзать не обязательно, он нужен только если вы хотите запускать прямо с кнопок сканера эту утилиту. Нажали на кнопку «autoscan», скан сохранился в нужную папку. Можно создать ярлык на утилиту с прописанным в параметре местом сохранения и пользоваться им с рабочего стола к примеру. Но тут полная альтернатива cmdtwain для этого есть.
                0
                И вот это называется «без костылей»?
                  0
                  А в чем костыли? Если мы воспользовались способом, которым регистрируются все официальные приложения — только нет нигде об этом достаточной информации. Пришлось добывать. Способ добычи я описал? заодно расписал все что мог.

                  Там все просто как паровоз: одна запись в реестр, перезагрузка, назначение клавиши. Все. Мы сделали только свою утилиту тихого сканирования, остальное стандартные фишки windows.
                    0
                    Это утилита делает? Или это надо вручную делать? Из статьи мне непонятно.
                      0
                      Если хотите, можете в ручную. Если не понимаете, то конце статьи есть пункт «Установка». Если будут вопросы пишите.
                      Утилита запись в реестр делает сама. За замечание спасибо, очень важно, дополню.
                        0
                        Сбивает с толку компоновка статьи.
                        «Вот мы будем работать с тем-то и тем-то. реестр, реестр, реестр, реестр, реестр,… Утилита».
                        Если б было написано «вот утилита, которая делает возможным сканирование и тд и тп в один клик. А вот, что она делает под капотом» — было бы понятнее.
                +1
                Прочитав «без окон», уже было надеялся увидеть инструкции для Linux…
                  0
                  Так на линкус то никто не жалуется. Там же все проще в разы? С windows как раз такие игры понадобились. Хотя и тут, как оказалось, проблемы то особой и не было никогда. Я думал все сложнее. Очень плохо с документацией на эту тему было. Судя по интернету, статья нуждалась в написании чтобы постараться закрыть течь негодования.
                  +1
                  Круто. Вот это реально круто. Я когда-то для удобного сканирования тупо создал утилиту, отправляющую сочетания клавиш окну сканирования в винде хр, по кругу работавшую с мастером сканирования…
                    0
                    Можно создать ярлык утилите, а ему же можно стандартными средствами в свойствах назначить горячии клавиши. Во времена XP я был молод и это мне было до лампочки)
                    +1
                    Крутяк. Я как заядлый виндузятник хочу гуевый фейс для проги, чтобы абсолютно всё можно было настроить в нём (хватит ведь и одного окошка), но в целом и так сойдёт, спасибо.
                      0
                      Есть замечательная утилита iCopy которая сканирует, копирует и сохраняет в Pdf с одной кнопки ) Попробуйте…
                        0
                        iCopy не прописывается на кнопки сканера.
                        0
                        Хорошая утилита, а как насчет исходников? а то паранойя дает о себе знать/
                          0
                          Да гляньте любым дизасемблером, так надежнее)
                            0
                            К сожалению, я не настолько крут, чтобы понимать ассемблер. :(
                              0
                              Сори) декомпилятор конечно) C# на ура должен открыться вплоть до исходника)
                                0
                                Класс WIAScanner не корректно декомпилируется. Поделитесь пожалуйста исходниками. Дело в том, что из реестра не выходит вызывать программу с параметрами, а без передачи параметров она не позволяет выбрать место для сохранения изображения.
                          0
                          «сканировать без окошек» — rootslan.com/rooscan
                          +1
                          Что бы изменения вступили в силу после редактирования реестра достаточно перезапустить службу «Служба загрузки изображений Windows (WIA)»
                          Делается это так:
                          net stop stisvc
                          net start stisvc
                          
                            0
                            Товарищи, а как это дружит с простыми МФУ? Вот стоит например Canon 3010 и у него нет кнопки скан. Есть небольшая локалка на 10 компов и для сканирования приходится выгонять человека из-за компьютера, куда включен МФУ. Как можно сделать сканирование на МФУ по нажатию кнопки, чтобы не выгонять человека?
                              0
                              Но у этого МФУ есть другие кнопки. Если сканер получает уведомление о нажатии хоть одной из кнопок, то уже можно сделать.
                              Какие события, например, высыпает программа?
                                0
                                C компа, к которому он подключен, работает сканирование через wia? Посмотрите в свойствах сканера, можно ли назначить хоть каким то кнопкам какие то события.
                                0
                                МФУ Canon MF3228 — с CmdTwain сканирует токлько 1/4 от А4 независимо от параметров коммандной строки. Попробовал QTwain — то же самое. Качаю visual studio чтобы скомпилировать предложенный в конце статьи visual basic исходник.
                                  0
                                  Вам не нужна для этого студия., компилятор идет отдельно. Да, с этим моментом я пока тоже для себя не разобрался. Где то что то задается. Не на всех компах проявляется. Пока я от этих экспериментов отошел, через месяц другой вернусь.
                                    0
                                    Удалось отсканировать с помощью visual basic скрипта по ссылке pastebin.com/ce5d8yFi. Да, для компиляции понадобился VBSedit, ссылка на него в начале скрипта. Изначально сканировало 1-битную картинку, за гуглил, добавил строку после «With .Properties» (75 строка)
                                    .Item("4104").Value = 24 ' Битность цветности
                                    24 для цветных картинок и 8 для оттенков серого.
                                    Планирую сделать приложение на qt, которое будет работать как простой веб сервер — запускать его на компе с подключенным сканером, по запросу сканировать и отдавать файл.
                                      0
                                      Вам для чего это нужно? Сканы отдавать на сайт?
                                        0
                                        Хочу настроить сетевой сканер, также как сетевой принтер. Человек положил листочек, вернулся к совему компу, открыл браузер, нажал кнопочку, сканер сосканировал на сервере в папку и отдал файл на скачивание. Также, смогу добавить кнопочку «со сканера» рядом с кнопкой «приложить файл» в корпоративной базе данных.
                                          0
                                          Сколько человек пользуются сканером? Может проще на каждую кнопку повесить свой путь до папки пользователя? Файл на скачивание через браузер как то жестоко. Может проще всем в одну кучу документы сливать а по сети до них уже доберуться?
                                            0
                                            Как вариант. Не нравится то, что, во-первых, все будут видеть чужие файлы, во-вторых, не работает логика — нажал-получил, а будет нажал-поискал-получил. Крутым решением было бы написать драйвер виртуального WIA (TWAIN?) устройства, чтобы можно было сканировать с других программ. В интернете можно найти подобные платные программы (для организации сетевого сканера), но я их не изучал.
                                              0
                                              WIA это компонент системы, им может пользоваться программа или нет по своему желанию. Если человеку далеко не нужно ходить по комнате, то логика нажал получил будет работать, потому что новые файлы всегда сверху, если отсортировать по изменениям.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое