我测试了一个小的 shell 扩展,引用了 article在代码项目上。虽然整个过程相当复杂,但我对以下方法是什么以及它们的作用有所了解。:
初始化,DragQueryFile,GetCommandString,InvokeCommand,QueryContextMenu
但是在通读之后我无法理解我们的 ContextMenu 扩展是如何与 .txt 文件相关联的。
文章解释说,如果我们查看 .rgs 文件,我们可以看到它创建了一个注册表项,如下所示:
HKCR
{
NoRemove txtfile
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove SimpleShlExt = s '{5E2121EE-0300-11D4-8D3B-444553540000}'
}
}
}
}
但实际上,按照文章编写代码后,当我打开 SimpleShlExt.rgs
时,它看起来像这样:
--在 CodeProject 中编辑--
HKCR
{
NoRemove CLSID
{
ForceRemove {1E569362-E0A6-4DEA-AB1F-67D6D3DEF1A5} = s 'SimpleShExt Class'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
}
注册表是否动态创建 CLSID 和 txtfile reg 条目之间的任何映射。
如果是这种情况,如果我想修改任何其他文件的行为,例如 mp3 文件或驱动器本身,并且我希望我的上下文菜单弹出或显示,那么如何去做。因为我不知道它的 CLSID。
最佳答案
一种可能是为您想要支持的所有文件扩展名注册您的上下文菜单。另一种可能性是在通配符/* 类中注册您的扩展。然后它将为所有文件实例化。然后您可以决定上下文菜单是否应该对该文件可见。这可以通过使用 IShellExtInit::Initialize 的 IDataObject 参数来完成。
关于c++ - 我们如何注册具有特定文件扩展名的 Shell 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758219/