通过右键单击桌面或目录背景创建 Shell 上下文菜单

Create a Shell ContextMenu by right clicking on Desktop or Directory Background

名为 SharpShell 的 .NET Shell 扩展框架很棒;我开发了一个右键单击文件 Shell ContextMenu "quite easily",可以选择文件和目录。

现在我想开发一个 Shell ContextMenu,方法是右键单击一个空的 space(即,在桌面上或当我在文件夹中时在一个白点上) . 是否有可能仍然使用 SharpShell?或者我需要转向不同的解决方案吗?......在第二种情况下......你有什么建议?

谢谢

我以前用过SharpShell,后来就忘记了(因为它完美无缺)。我在文件和文件夹上使用过它,所以你的问题引起了我的兴趣。对该工具的一点研究使我得到了答案(不幸的是)。

绑定是通过 SharpShell 上的 com 服务器关联完成的。通过查看 com 服务器关联的 documentation,我没有看到实现所需功能的方法。

PS:我鼓励您在文档页面上发表评论,或直接与库的作者联系。他似乎真的很有帮助(我之前联系过他)。

下面提供的两个解决方案有效,但与此同时我发现有一个更简单的解决方案实际上已经在 SharpShell.

附带的示例中使用了

请参阅 CopyDirectoryLocationHandler class 作为为目录背景(和桌面)注册的上下文菜单处理程序的示例:

[ComVisible(true)]
[COMServerAssociation(AssociationType.Class, @"Directory\Background")]
public class CopyDirectoryLocationHandler : SharpContextMenu
{
   // ...
}

如果您希望处理程序只处理桌面背景上的点击,请改用此代码:

[ComVisible(true)]
[COMServerAssociation(AssociationType.Class, @"DesktopBackground")]
public class CopyDirectoryLocationHandler : SharpContextMenu
{
   // ...
}

旧的过时答案:

您可以毫无问题地使用 SharpShell 来达到这个目的。有两种可能的方法:

  1. 注册Shell扩展来处理文件夹背景 你自己

  1. 修改SharpShell处理注册 文件夹背景的扩展。

注册Shell扩展自己处理文件夹背景

您的 shell 扩展是一个 COM 服务器,因此通过 GUID 被系统识别。然后,此 GUID 在注册表中的某些位置用于为不同的目的注册 COM 扩展。当我们为了扩展文件夹背景的上下文菜单等目的而手动注册扩展时,最好让我们的扩展具有固定的 GUID。

目前您的 class 看起来像这样:

 [ComVisible(true)]
 [COMServerAssociation(AssociationType.Directory)]
 public class MyContextMenuExtension : SharpContextMenu
 {

编译时,编译器会自动生成一个 GUID 用于 class。但是我们可以像这样指定一个特定的使用:

 [Guid("A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0")]
 [ComVisible(true)]
 [COMServerAssociation(AssociationType.Directory)]
 public class MyContextMenuExtension : SharpContextMenu
 {

不要使用与此处所示相同的 GUID,而是通过菜单工具 > 创建 GUID 在 Visual Studio 中创建您自己的唯一 GUID。为您编写的每个 shell 扩展使用不同的 GUID。

然后重新编译dll并重新安装和注册(使用regasm或SharpShell服务器管理器工具。

然后创建一个名为 "registry.reg" 的文本文件,内容如下(使用您自己的特定 GUID)。而不是 "MyContextMenuExtension" 指定扩展名。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\MyContextMenuExtension]
@="{A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0}"

双击安装 "registry.reg" 文件。当您打开文件夹背景或桌面的上下文菜单时,您的扩展现在应该处于活动状态。

除了使用 *.reg 文件,您还可以使用注册表编辑器手动进行更改,或者如果您有安装程序,则指示安装程序进行这些注册表更改。


修改SharpShell为您处理文件夹背景扩展名的注册

对 SharpShell 源代码进行以下更改:

在文件 AssociationType.cs 中向 AssociationType 枚举添加一个新的枚举值:

  /// <summary>
  /// Create an association to the unknown files class.
  /// </summary>
  UnknownFiles,

  /// <summary>
  /// Create an association to the background of folders and the desktop
  /// </summary>
  DirectoryBackground

在文件ServerRegistrationManager.cs中添加一个新的私有字符串常量:

/// <summary>
/// The 'directory' special class.
/// </summary>
private const string SpecialClass_Directory = @"Directory";

 /// <summary>
/// The 'directory background' special class.
/// </summary>
private const string SpecialClass_DirectoryBackground = @"Directory\Background";

同样在文件ServerRegistrationManager.cs中的方法CreateClassNamesForAssociations中的big switch语句添加一个新的case如下:

          case AssociationType.Directory:

               //  Return the directory class.
               return new[] { SpecialClass_Directory };

          case AssociationType.DirectoryBackground:

               //  Return the directory background class.
               return new[] { SpecialClass_DirectoryBackground };

最后你只需要告诉你自己的分机class使用这个新的枚举值:

 [Guid("A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0")]
 [ComVisible(true)]
 [COMServerAssociation(AssociationType.Directory)]
 [COMServerAssociation(AssociationType.DirectoryBackground)]
 public class MyContextMenuExtension : SharpContextMenu
 {