如何检索/遍历Windows 11的IExplorerCommand上下文菜单项?
大约五年前,我为客户开发了一款程序,可在程序内重现Windows资源管理器的上下文菜单——点击代表数据文件的对象时,会显示与资源管理器中一致的上下文菜单,包括Dropbox共享菜单项。实现逻辑是从注册表中查找所有IContextMenu COM对象,逐个查询以添加菜单项。
一直以来该程序运行正常,但Windows 11带来了变化,新版Dropbox客户端(v159)打破了向后兼容性。
旧式IContextMenu COM对象可在HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers(或类似位置)查询,但Windows 11的新式精简上下文菜单改用IExplorerCommand对象。资源管理器会在旧式上下文菜单及IContextMenu迭代中包含这些对象——Dropbox曾因此出现菜单项重复的bug,他们在v159版本中通过禁用IContextMenu项修复了该问题,这导致我的程序中不再显示这些菜单项。
那么,我该如何查找并遍历添加到新式精简上下文菜单中的所有IExplorerCommand对象?包括Dropbox这类应用的云提供商命令?
我可在Dropbox的AppxManifest.xml中找到其菜单项的类ID:
<Extensions> <desktop3:Extension Category="windows.cloudFiles"> <desktop3:CloudFiles> <desktop3:CloudFilesContextMenus> <desktop3:Verb Id="Dropbox01UpgradeCommand" Clsid="F3BC3DAF-431B-4F0E-B105-E9BB76335840" /> <desktop3:Verb Id="Dropbox02ShareCommand" Clsid="7F4C5B83-2680-40AF-9AE9-2161AA759EF2" />
它还定义了这些对象运行的COM服务器:
<com:Extension Category="windows.comServer"> <com:ComServer> <com:SurrogateServer AppId="67233DFC-D70F-4D8E-A068-6877D86826BC" DisplayName="ms-resource:ShellExtensionServerDisplayName"> <com:Class Id="7F4C5B83-2680-40AF-9AE9-2161AA759EF2" Path="DropboxExt64.55.0.dll" ThreadingModel="STA" /> <com:Class Id="F3BC3DAF-431B-4F0E-B105-E9BB76335840" Path="DropboxExt64.55.0.dll" ThreadingModel="STA" />
这些条目也可见于HKEY_CLASSES_ROOT\PackagedCom,例如:
[HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Server\0] [HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Class{7F4C5B83-2680-40AF-9AE9-2161AA759EF2}] [HKEY_CLASSES_ROOT\PackagedCom\Package\DropboxInc.Dropbox_159.4.5870.0_x86__wkt425jdc3sga\Class{F3BC3DAF-431B-4F0E-B105-E9BB76335840}]
但我甚至无法为这些类ID创建IUnknown实例——即使在Windows资源管理器内的外壳扩展中也不行,更不用说我的应用程序了。我得到HRESULT错误0x80040154 (-2147221164)。
核心疑问:
- 如何定位这些
IExplorerCommand项?(注意:若使用ICatInformation::EnumClassesOfCategories(),Dropbox项未定义类别信息) - 如果无法构建完整列表,至少有没有办法访问Dropbox这类已知对象?
内容的提问来源于stack exchange,提问作者user1371844

