bar*_*aru 4 c# contextmenu windows-shell shell-extensions sharpshell
名为SharpShell的 .NET Shell 扩展框架很棒;我开发了一个“非常容易”的右键单击文件 Shell ContextMenu,它可以同时选择文件和目录。
现在,我想通过右键单击空白区域(即,在桌面上或在文件夹内的白点上)来开发 Shell ContextMenu。是否有可能仍然使用 SharpShell?或者我需要转向不同的解决方案吗?......在第二种情况下......你有什么建议?
谢谢
下面介绍的两个解决方案有效,但同时我发现有一个更简单的解决方案,实际上已经在 SharpShell 附带的示例中使用。
将该CopyDirectoryLocationHandler类作为为目录背景(和桌面)注册的上下文菜单处理程序的示例:
[ComVisible(true)]
[COMServerAssociation(AssociationType.Class, @"Directory\Background")]
public class CopyDirectoryLocationHandler : SharpContextMenu
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您希望处理程序仅处理桌面背景上的点击,请改用以下代码:
[ComVisible(true)]
[COMServerAssociation(AssociationType.Class, @"DesktopBackground")]
public class CopyDirectoryLocationHandler : SharpContextMenu
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
旧的过时答案:
您可以毫无问题地将 SharpShell 用于此目的。有两种可能的方法:
或者
您的外壳扩展是一个 COM 服务器,因此通过 GUID 向系统标识。然后在注册表中的位置使用此 GUID 来为不同的目的注册 COM 扩展。当我们为了扩展文件夹背景的上下文菜单等目的而手动注册扩展时,最好是我们的扩展具有固定的 GUID。
目前你的班级看起来像这样:
[ComVisible(true)]
[COMServerAssociation(AssociationType.Directory)]
public class MyContextMenuExtension : SharpContextMenu
{
Run Code Online (Sandbox Code Playgroud)
编译时,编译器将自动生成用于该类的 GUID。但是我们可以像这样指定一个特定的使用:
[Guid("A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0")]
[ComVisible(true)]
[COMServerAssociation(AssociationType.Directory)]
public class MyContextMenuExtension : SharpContextMenu
{
Run Code Online (Sandbox Code Playgroud)
不要使用与此处显示的相同的 GUID,而是通过菜单工具 > 创建 GUID 在 Visual Studio 中创建您自己的唯一 GUID。为您编写的每个 shell 扩展使用不同的 GUID。
然后重新编译dll并重新安装和注册(使用regasm或SharpShell Server Manager工具。
然后使用以下内容创建一个名为“registry.reg”的文本文件(使用您自己的特定 GUID)。而不是“MyContextMenuExtension”指定您的扩展名。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\MyContextMenuExtension]
@="{A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0}"
Run Code Online (Sandbox Code Playgroud)
双击安装“registry.reg”文件。当您打开文件夹背景或桌面的上下文菜单时,您的扩展程序现在应该处于活动状态。
除了使用 *.reg 文件,您还可以使用注册表编辑器手动进行更改,或者如果您有安装程序指示安装程序进行这些注册表更改。
对 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
Run Code Online (Sandbox Code Playgroud)
在文件中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";
Run Code Online (Sandbox Code Playgroud)
同样在big switch 语句ServerRegistrationManager.cs的方法中的文件中CreateClassNamesForAssociations添加一个新案例,如下所示:
case AssociationType.Directory:
// Return the directory class.
return new[] { SpecialClass_Directory };
case AssociationType.DirectoryBackground:
// Return the directory background class.
return new[] { SpecialClass_DirectoryBackground };
Run Code Online (Sandbox Code Playgroud)
最后你只需要告诉你自己的扩展类使用这个新的枚举值:
[Guid("A75AFD0D-4A63-41E3-AAAA-AD08A574B8B0")]
[ComVisible(true)]
[COMServerAssociation(AssociationType.Directory)]
[COMServerAssociation(AssociationType.DirectoryBackground)]
public class MyContextMenuExtension : SharpContextMenu
{
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |