当我将我的数码相机与我的计算机连接时,将出现一个对话框,其中包含可用于从相机获取图像的所有注册程序。现在我想在列表中添加我自己的程序,这样当我单击我的程序的项目时,我就可以使用我自己的程序从数码相机获取图像。
非常感谢。
发布于 2009-06-27 00:57:16
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设备的密钥。
请记住,这些位置未记录在案。你自己承担风险,你的里程数会有所不同,...
发布于 2009-01-21 11:54:43
您需要使用WIA (Windows图像采集)接口。IWiaDevMgr提供了三种方法来实现这一点: RegisterEventCallbackProgram、RegisterEventCallbackCLSID和RegisterEventCallbackInterface。如果您希望Windows在用户单击“自动播放”对话框中的您时启动您的程序,您可以使用RegisterEventCallbackProgram或RegisterEventCallbackCLSID。
https://stackoverflow.com/questions/324974
复制相似问题