Camera 在WIA中,如何将我的程序添加到从数码相机获取图像的程序列表中?

Camera 在WIA中,如何将我的程序添加到从数码相机获取图像的程序列表中?,camera,wia,Camera,Wia,当我将数码相机与计算机连接时,将出现一个对话框,其中包含可用于从相机获取图像的所有已注册程序。现在我想在列表中添加我自己的程序,这样当我单击程序项时,我可以使用我自己的程序从数码相机获取图像 非常感谢。您需要使用WIA(Windows图像采集)界面。IWiaDevMgr提供了三种方法:RegisterEventCallbackProgram、RegisterEventCallbackCLSID和RegisterEventCallbackInterface。如果希望Windows在用户在“自动播放

当我将数码相机与计算机连接时,将出现一个对话框,其中包含可用于从相机获取图像的所有已注册程序。现在我想在列表中添加我自己的程序,这样当我单击程序项时,我可以使用我自己的程序从数码相机获取图像


非常感谢。

您需要使用WIA(Windows图像采集)界面。IWiaDevMgr提供了三种方法:RegisterEventCallbackProgram、RegisterEventCallbackCLSID和RegisterEventCallbackInterface。如果希望Windows在用户在“自动播放”对话框中单击您时启动程序,则可以使用RegisterEventCallbackProgram或RegisterEventCallbackCLSID。

WIA有一个设备管理器对象,该对象提供一个允许程序注册事件通知的接口

联系设备管理器 您可以使用
IWiaDevMgr
界面与设备管理器交互。通过调用
CoCreateInstance()
,可以获得指向该接口的指针:

为事件注册程序 然后,注册要在事件触发时运行的程序非常简单:

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_REGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);
命令行、名称、描述和图标都是
BSTR
s,因为它们都是通过COM接口传递的。您可以使用
SysAllocString()
及其好友来创建它们,也可以使用Visual C extensions或ATL提供的类来创建和管理它们

释放设备管理器 如果您没有为接口使用COM感知智能指针,请不要忘记释放
CoCreateInstance()
获取的引用:

如果你不发布它,COM系统会找到一种惩罚你的方法,但它可能不会立即显现出来

注销 偶然测试表明,当用于注册事件的所有四个参数都被准确传递时,删除已注册事件是有效的。电话是:

pWiaDevMgr->RegisterEventCallbackProgram(
    WIA_UNREGISTER_EVENT_CALLBACK,
    NULL,
    &WIA_EVENT_DEVICE_CONNECTED,
    bstrCommandline,
    bstrName,
    bstrDescription,
    bstrIcon);
这是一个潜在的麻烦,因为似乎没有记录在案的API来列出已注册的事件。这意味着,如果您的安装程序注册了一个程序,那么它还应该保留所用参数的记录,以便您的卸载程序可以注销该事件

事件参数 命令行可以包含字符串
%1
%2
,在解析命令行之前,这些字符串将分别替换为触发的事件的端口名和GUID

图标、名称和说明将显示在插入相机后呈现给用户的列表中。名称应短于描述

图标是文件名和资源标识符的组合。一个好的默认值是
“sti.dll,0”
,它将是相机和扫描仪的通用图像。如果您提供自己的图标,字符串几乎肯定必须包含指向DLL的完全限定路径。我可以想象,故意在路径中的任何位置包含逗号,而不是在资源id之前作为分隔符,会造成麻烦

幕后 WIA/STI存储事件列表的实际位置没有记录。然而,通过在regedit中进行一些搜索,我在xpsp3系统上找到了事件目录。有人可能会想象它会在其他系统的类似位置被发现

注册表项
HKLM\SYSTEM\currentcontrolset\Control\StillImage\Events
包含系统已知的每个事件的子项。每个键都有一个名为GUID的值,其中包含标识该事件的GUID

例如,设备连接的事件处理程序列在
Connect
子项中

单个WIA/STI设备的密钥可在
HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}
密钥中找到

请记住,这些位置没有记录在案。触摸它们的风险由您自己承担,您的里程数会有所不同

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