当我将数码相机与电脑连接时,会出现一个包含所有已注册程序的对话框,可以显示来自相机的图像。现在我想在列表中添加自己的程序,这样当我点击我的程序项目时,我可以使用自己的程序从数码相机中获取图像。
非常感谢。
答案 0 :(得分:7)
WIA有一个Device Manager对象,它提供了一个允许程序注册事件通知的界面。
您使用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
,因为它们正在通过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。
Device Connected事件处理程序列在Connect
子项中。
单个WIA / STI设备的密钥可以在HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}
密钥中找到。
请记住,这些位置没有记录。触摸它们需要您自担风险,里程会有所不同,......
答案 1 :(得分:0)
您需要使用WIA(Windows Image Acquisition)界面。 IWiaDevMgr提供了三种方法:RegisterEventCallbackProgram,RegisterEventCallbackCLSID和RegisterEventCallbackInterface。如果希望Windows在用户在“自动播放”对话框中单击您时启动程序,则可以使用RegisterEventCallbackProgram或RegisterEventCallbackCLSID。