将数码相机连接到计算机时,将出现一个对话框,其中包含所有已注册的程序,可用于从相机中获取图像。现在,我想在列表中添加自己的程序,以便在单击程序项时,可以使用自己的程序从数码相机获取图像。
非常感谢你。
最佳答案
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
,因为它们是通过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
子项中列出了设备连接的事件处理程序。在其他位置的
HKLM\SYSTEM\CurrentControlSet\Control\Class\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}
键中可以找到单个WIA / STI设备的键。请记住,这些位置没有记录在案。触摸它们需要您自担风险,您的行驶里程会有所不同,...
关于camera - 在WIA中,如何将我的程序添加到从数码相机获取图像的程序列表中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/324974/