1

我已经参考代码项目上的文章测试了一个小型 shell 扩展。尽管整个过程相当复杂,但我对以下方法以及它们的作用有所了解:

Initialize,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。

4

3 回答 3

1

一种可能性是为您想要支持的所有文件扩展名注册您的上下文菜单。另一种可能性是在通配符 / * 类中注册您的扩展。然后它将为所有文件实例化。然后,您可以决定上下文菜单是否应该对此文件可见。这可以通过使用 IShellExtInit::Initialize 的 IDataObject 参数来完成。

于 2010-09-21T10:44:41.967 回答
0

您必须手动将要使用 txt 文件扩展名注册的部分添加到 rgs 文件中。Visual Studio 只添加了注册 shell 扩展的部分。

于 2010-09-21T14:07:18.730 回答
0

假设您的 libuuid5E2121EE-0300-11D4-8D3B-444553540000,然后使用以下命令将您的 shell 扩展名与*.txt*.tab文件相关联。每个新扩展添加另一个块:

NoRemove .txt  
{  
    NoRemove shellex  
    {  
        {00021500-0000-0000-C000-000000000046} = s '{5E2121EE-0300-11D4-8D3B-444553540000}'  
    }  
}  
NoRemove .tab  
{  
    NoRemove shellex  
    {  
        {00021500-0000-0000-C000-000000000046} = s '{5E2121EE-0300-11D4-8D3B-444553540000}'  
    }  
}
于 2021-02-12T14:56:27.103 回答