我想自定义在windows桌面和windows资源管理器上右键单击文件夹时出现的菜单。由于我的菜单显示的文本应该是动态的(取决于文件夹路径),我在 C++ Dll 中实现了
IContextMenu
接口,并在我的注册表中指定了 CLSID
和 DLL 路径。
有效,当用户右键单击一个文件夹时,shell 调用我的
IContextMenu::QueryContextMenu
函数,我可以在MENUITEMINFOA
中插入我的HMENU
结构。然后用户可以在上下文菜单中看到它。
我的问题是如何获取用户在将我的
MENUITEMINFOA
结构插入HMENU
之前右键单击的文件夹路径所以我可以调整我放在MENUITEMINFOA.dwTypeData
中的内容?
我尝试实现
IShellExtInit
接口,因为 shell 似乎可以使用此接口提供信息,但是当我记录对我的 dll 的调用时,我发现 shell 永远不会调用 IShellExtInit::Initialize
.
我猜 shell 通过我没有实现的接口提供信息,但我在文档中找不到任何线索。然而,这似乎是可行的,例如,TortoiseSVN 这样做:上下文菜单在某些文件夹上显示“SVN Checkout ...”,在其他一些文件夹上显示“SVN Update”/“SVN Commit ...”。
祝你有美好的一天:)
根据微软的文档:
像所有 COM 对象一样,Shell 扩展处理程序必须实现一个
接口和一个类工厂。大多数扩展处理程序还必须在 Windows XP 或更早版本中实现IUnknown
或IPersistFile
接口。 这些在 Windows Vista 中被IShellExtInit
、IInitializeWithStream
和IInitializeWithItem
取代。 Shell 使用这些接口来初始化处理程序。IInitializeWithFile
因此,在您的情况下,实施
IInitializeWithItem
将为您提供一个 IShellItem
接口,实施 IInitializeWithFile
将为您提供一个文件路径字符串。