c++ - 我们如何注册具有特定文件扩展名的 Shell 扩展

标签 c++ windows windows-shell shell-extensions

我测试了一个小的 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/

相关文章:

c++ - 摆脱重复代码?

c++ - 方法指针转换

c++ - C++ 类型在列表中 self 注册的最佳方式?

windows - "if exist"命令在 Windows 批处理脚本中如何工作?

windows - 在没有 lodctr 的情况下注册性能计数器

C++在程序文件中创建文件的过程

c++ - 在 C++ 中乘以 2 个大数有错误的结果

c++ - 我的命名空间扩展未在“文件打开”对话框中列出

powershell - 确定 Windows-shell 命令在 Powershell 中完成的时间

c++ - 低级 Hook /SetWindowsHookEx lParam 自动重复?