В WIA, Как я могу добавить свою программу в список программ получения изображений с цифровой камеры? - PullRequest
3 голосов
/ 28 ноября 2008

Когда я подключаю свою цифровую камеру к компьютеру, может появиться диалоговое окно со всеми зарегистрированными программами для получения изображений с камеры. Теперь я хочу добавить свою собственную программу в список, чтобы при нажатии на элемент моей программы я мог использовать свою собственную программу для получения изображений с цифровой камеры.

Большое спасибо.

Ответы [ 2 ]

7 голосов
/ 27 июня 2009

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

Обращение в диспетчер устройств

Вы используете интерфейс IWiaDevMgr для взаимодействия с диспетчером устройств. Вы получаете указатель на этот интерфейс с вызовом CoCreateInstance():

    IWiaDevMgr *pWiaDevMgr;
    HRESULT hr;
    hr = CoCreateInstance(CLSID_WiaDevMgr,
        NULL,
        CLSCTX_LOCAL_SERVER,
        IID_IWiaDevMgr,
        (void*)&pWiaDevMgr);

Регистрация программы для события

Затем зарегистрировать программу, запускаемую при возникновении события, просто:

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_REGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);

Командная строка, имя, описание и значок - все BSTR s, потому что они проходят через интерфейс COM. Вы можете либо использовать SysAllocString() и его друзей для их создания, либо использовать классы, предоставляемые расширениями Visual C или ATL, для их создания и управления ими.

Выпуск диспетчера устройств

Если вы не используете интеллектуальный указатель с поддержкой COM для интерфейса, не забудьте опубликовать ссылку, взятую CoCreateInstance():

    pWiaDevMgr->Release();

Если вы не отпустите его, система COM найдет способ наказать вас, но это может быть не сразу очевидно ...

1029 * отмены регистрации * Случайное тестирование показывает, что удаление зарегистрированного события работает, когда все четыре параметра, используемые для регистрации события, переданы точно. Вызов: pWiaDevMgr->RegisterEventCallbackProgram( WIA_UNREGISTER_EVENT_CALLBACK, NULL, &WIA_EVENT_DEVICE_CONNECTED, bstrCommandline, bstrName, bstrDescription, bstrIcon); Это может раздражать, потому что, похоже, нет документированного API для перечисления зарегистрированных событий. Это означает, что если ваш установщик регистрирует программу, он также должен хранить записи об используемых аргументах, чтобы программа удаления могла отменить регистрацию события. Параметры события

Командная строка может содержать строки %1 и %2, которые будут заменены именем порта и GUID события, которое сработало, соответственно, перед анализом командной строки.

Значок, имя и описание отображаются в списке, представленном пользователю при подключении камеры. Имя должно быть короче, чем описание.

Значок представляет собой комбинацию имени файла и идентификатора ресурса. Хорошим значением по умолчанию является "sti.dll,0", которое будет общим изображением камеры и сканера. Если вы предоставите свой собственный значок, строка почти наверняка должна включать полный путь к DLL. Выйдя на конечность, я бы предположил, что намеренное включение запятой в любом месте пути, кроме разделителя перед идентификатором ресурса, вызовет проблемы.

За кулисами

Фактическое место, где WIA / STI хранит список событий, не задокументировано. Однако после небольшого поиска в regedit я нашел каталог событий в моей системе XP SP3. Можно подумать, что его можно найти в аналогичном месте в других системах ...

Раздел реестра HKLM\SYSTEM\CurrrentControlSet\Control\StillImage\Events содержит подраздел для каждого события, известного системе. Каждый ключ имеет значение с именем GUID, содержащее GUID, который идентифицирует это событие.

Обработчики событий, связанных с устройством, перечислены, например, в подразделе Connect.

Ключи для отдельных устройств WIA / STI можно найти в ключе HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F} среди других мест.

Помните, что эти места не задокументированы. Прикасайтесь к ним на свой страх и риск, ваш пробег будет разным, ...

0 голосов
/ 21 января 2009

Вам необходимо использовать интерфейс WIA (Windows Image Acquisition). IWiaDevMgr предоставляет три метода для этого: RegisterEventCallbackProgram, RegisterEventCallbackCLSID и RegisterEventCallbackInterface. Если вы хотите, чтобы Windows запускала вашу программу, когда пользователь щелкает вас в диалоге автозапуска, вы можете использовать RegisterEventCallbackProgram или RegisterEventCallbackCLSID.

...