通过右键单击桌面或目录背景创建 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 来达到这个目的。有两种可能的方法:
- 注册Shell扩展来处理文件夹背景
你自己
或
- 修改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
{
名为 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 来达到这个目的。有两种可能的方法:
- 注册Shell扩展来处理文件夹背景 你自己
或
- 修改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
{