当我将数码相机与计算机连接时,会出现一个对话框,其中包含所有可用于从相机获取图像的注册程序。现在我想在列表中添加我自己的程序,这样当我单击我的程序的项目时,我可以使用我自己的程序从数码相机中获取图像。
非常感谢。
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系统会想办法惩罚你,但它可能不会立即明显......
偶然测试表明,当用于注册事件的所有四个参数都准确传递时,删除已注册的事件是有效的。电话是:
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}
密钥等其他地方找到。
请记住,这些位置没有记录在案。触摸它们需要您自担风险,您的里程会有所不同,...
您需要使用 WIA(Windows Image Acquisition)界面。IWiaDevMgr 提供了三种方法来执行此操作:RegisterEventCallbackProgram、RegisterEventCallbackCLSID 和 RegisterEventCallbackInterface。如果您希望 Windows 在用户在“自动播放”对话框中单击您时启动您的程序,您可以使用 RegisterEventCallbackProgram 或 RegisterEventCallbackCLSID。