3

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

非常感谢。

4

2 回答 2

7

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);

命令行、名称、描述和图标都是BSTRs,因为它们是通过一个COM接口传递的。您可以使用SysAllocString()和它的朋友来创建它们,或者使用 Visual C 扩展或 ATL 提供的类来创建和管理它们。

释放设备管理器

如果您没有为接口使用支持 COM 的智能指针,请不要忘记释放以下引用的引用CoCreateInstance()

    pWiaDevMgr->Release();

如果你不释放它,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 中进行一些搜索,我在我的 XP SP3 系统上找到了事件目录。人们可能会想象它会在其他系统中的类似位置找到......

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

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

各个 WIA/STI 设备的密钥可以在HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}密钥等其他地方找到。

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

于 2009-06-27T00:57:16.263 回答
0

您需要使用 WIA(Windows Image Acquisition)界面。IWiaDevMgr 提供了三种方法来执行此操作:RegisterEventCallbackProgram、RegisterEventCallbackCLSID 和 RegisterEventCallbackInterface。如果您希望 Windows 在用户在“自动播放”对话框中单击您时启动您的程序,您可以使用 RegisterEventCallbackProgram 或 RegisterEventCallbackCLSID。

于 2009-01-21T11:54:43.247 回答