.NET Shell Extensions - Shell Drop Handlers (拖放处理程序)
使用 .NET 快速创建 Shell Drop Handler 扩展
引言
Shell Drop Handler 是在系统中注册的 DLL,用于扩展 Shell 中的拖放功能。您可以使用这些扩展来允许文件成为其他文件的放置目标,或者利用标准的拖放功能来调用您自己的业务逻辑。在本文中,我将向您展示如何使用 .NET 和一个名为 SharpShell 的库来创建 Drag Handler 扩展。
我们将创建的 Drag Handler 将允许用户将 XML 文件拖放到 XSD 文件上,并根据 XSD 架构验证 XML 文件内容。下面是它的样子。
系列文章
本文是 '.NET Shell Extensions' 系列的一部分,该系列包括
- .NET Shell Extensions - Shell Context Menus (右键菜单扩展)
- .NET Shell Extensions - Shell Icon Handlers (图标处理程序)
- .NET Shell Extensions - Shell Info Tip Handlers (信息提示处理程序)
- .NET Shell Extensions - Shell Drop Handlers (拖放处理程序)
- .NET Shell Extensions - Shell Preview Handlers (预览处理程序)
- .NET Shell Extensions - Shell Icon Overlay Handlers (图标叠加处理程序)
- .NET Shell Extensions - Shell Thumbnail Handlers (缩略图处理程序)
- .NET Shell Extensions - Shell Property Sheets (属性表处理程序)
步骤 1:创建项目
首先,创建一个新的 C# 类库项目。
提示:您可以使用 Visual Basic 而不是 C# - 在本文中,源代码是 C#,但创建 Visual Basic Shell Extension 的方法是一样的。
在此示例中,我们将项目命名为 'XsdDropHandler
'。将 'Class1.cs' 文件重命名为 'XsdDropHandler.cs'。
现在添加以下引用
System.Windows.Forms
System.Drawing
这些引用包含了 SharpShell 库其他部分所需的各种有用的组件,例如图标和上下文菜单。
提示:如果您使用 Nuget 安装 SharpShell(参见“第 2 步”),则无需添加这些引用 - 它们会自动添加。
步骤 2:引用 SharpShell
现在我们需要添加对 SharpShell 核心库的引用。您可以通过多种方式完成此操作
添加引用
下载文章顶部的“SharpShell Core Library”zip 文件,并添加对 SharpShell.dll 文件的引用。
提示:本文提供的下载在撰写本文时是正确的 - 如果您需要最新版本,请使用 Nuget(如下所述)或从 sharpshell.codeplex.com 获取库。
使用 Nuget
如果您安装了 Nuget,只需快速搜索 SharpShell 并直接安装即可 - 或在此处获取包详细信息 https://nuget.net.cn/packages/SharpShell。
使用 CodePlex
与其从本页获取库(可能不是最新版本),不如始终从 CodePlex 获取最新版本的库 - 在 SharpShell 主页 sharpshell.codeplex.com。Nuget 始终拥有最新的稳定版本 - CodePlex 可能有 beta 版本,而 CodeProject 文章将包含撰写本文时可用的版本。
第 3 步:派生自 SharpDropHandler
项目设置完成后,我们可以将 XsdDropHandler
类派生自 SharpDropHandler
。SharpDropHandler
是 Drop Handler Shell 扩展的基类 - 它将提供所有必需的 COM 管道和互操作 - 我们只需实现几个抽象成员来提供业务逻辑。所以您的类看起来应该像这样
public class XsdDropHandler : SharpDropHandler
{
}
对于 drop handler,基类中有两个抽象函数,我们必须在派生类中实现它们。
DragEnter
protected abstract void DragEnter(DragEventArgs dragEventArgs);
当用户选择了一些 shell 项并将其拖放到您注册了扩展的 shell 项上时(因此在我们的例子中,当用户将任何东西拖放到 XSD 文件上时),就会调用 DragEnter
。您必须在 DragEnter
函数中执行以下操作
- 检查正在拖动的文件的集合(这些文件位于 '
DragItems
' 成员中)。 - 根据您允许的拖动操作,将
dragEventArgs.Effect
成员设置为您允许的效果。
因此,例如在我们的 drop handler 中,我们将确保每个拖动的都是 XML 文件。如果都是 XML 文件,我们将把拖动效果设置为“link”。
Drop
protected abstract void Drop(DragEventArgs dragEventArgs);
当用户释放鼠标并需要调用实际功能时,将调用 Drop
。DragEventArgs
提供了以防您需要查看正在按下的键或鼠标位置等内容。
在我们的示例中,我们将在该函数中打开验证窗体。
第 4 步:实现 DragEnter
如前所述,DragEnter
仅当每个拖动文件都是 XML 文件时才允许“link”效果。代码如下
/// <summary>
/// Checks what operations are available for dragging onto the target with the drag files.
/// </summary>
/// <param name="dragEventArgs">The <see cref="System.Windows.Forms.DragEventArgs"/>
/// instance containing the event data.</param>
protected override void DragEnter(DragEventArgs dragEventArgs)
{
// Check the drag files - if they're all XML, we can validate them against the XSD.
dragEventArgs.Effect =
DragItems.All(di => string.Compare(Path.GetExtension(di), ".xml",
StringComparison.InvariantCultureIgnoreCase) == 0)
? DragDropEffects.Link : DragDropEffects.None;
}
这足够简单,不需要太多解释。我们使用 Linq 语句 'All
' 来验证每个路径(扩展名是 XML)的条件,如果为 true
,我们将拖动效果设置为 link。
第 5 步:实现 Drop
Drop 甚至更简单 - 我们将路径传递给窗体。
提示:请记住,对于
SharpDropHandler
,拖动的文件的存储在 'DragFiles
' 属性中,我们正在拖动的对象存储在 'SelectedItemPath
' 属性中。
/// <summary>
/// Performs the drop.
/// </summary>
/// <param name="dragEventArgs">The <see cref="System.Windows.Forms.DragEventArgs"/>
/// instance containing the event data.</param>
protected override void Drop(DragEventArgs dragEventArgs)
{
// Create the validator output form.
var validatorOutputForm = new ValidationOutputForm
{XsdFilePath = SelectedItemPath, XmlFilePaths = DragItems};
validatorOutputForm.ShowDialog();
}
在此函数中,我们将 xsd 路径(即 SelectedItemPath
属性)和 xml 路径(DragItems
属性)传递给我们的 ValidationOutputForm
,我们将在下一步构建它。
在这里,您可以看到实现扩展核心业务逻辑是多么简单。
第 6 步:验证窗体
我将不会在这里详细介绍 - 代码在源代码的 XsdDropHandler
示例中。这基本上是一个非常简单的 WinForms 窗体,它显示验证结果列表,验证结果来自使用 XmlReader
读取 XML 文件,并根据提供的架构文件进行验证。
第 7 步:处理 COM 注册
只剩下几件事情要做。首先,我们必须为我们的类添加 ComVisible
属性。这是因为我们的类是一个 COM 服务器,必须对尝试使用它的其他代码可见。
[ComVisible(true)]
public class XsdDropHandler : SharpDropHandler
接下来,我们必须为程序集提供强名称。有绕过此要求的方法,但通常这是最好的方法。为此,右键单击项目并选择“属性”。然后转到“签名”。选择“签名程序集”,为密钥指定“新建”并选择一个密钥名称。如果您愿意,可以为密钥设置密码,但这不是必需的
最后,我们需要将我们的扩展与一些我们想使用的 shell 项关联起来。我们可以通过 COMServerAssociation
属性来实现
[COMServerAssociation(AssociationType.ClassOfExtension, ".xsd")]
public class XsdDropHandler : SharpDropHandler
那么我们在这里做了什么?我们告诉 SharpShell,在注册服务器时,我们希望它与系统中的 XSD 文件类相关联。
您可以与文件、文件夹、类、驱动器等关联 - 有关使用关联属性的完整文档可在 CodePlex 网站的 COM Server Associations 上找到。
我们完成了!构建项目会创建 XsdDropHandler
程序集,该程序集可以注册为 COM 服务器以将扩展添加到系统中,从而允许您将 XML 文件拖放到 XSD 文件上以根据架构进行验证。
调试 Shell Extension
如果您看过我关于 .NET Shell 扩展的其他文章,您可能会认出“Server Manager”工具。这是 SharpShell 源代码中的一个工具,可用于帮助调试 Shell 扩展。
提示:如果你想要最新版本的工具,它们可以从 CodePlex 网站预先构建好。
打开 Sever Manager 工具并使用 File > Load Server 加载 XsdDropHandler.dll 文件。您也可以将服务器拖到主窗口中。选择服务器将显示一些关于它的详细信息。选择服务器。
现在,大多数 SharpShell 服务器都可以直接在此应用程序中进行测试,方法是选择它们并选择“Test Shell” - 但是,至少在这个阶段,Shell Drop Handlers 无法以这种方式进行测试。还有另一个机制 - 按“Test Shell”打开测试 shell,然后选择“Shell Open Dialog”。
一旦 Shell Open Dialog 打开,您就可以将文件拖放到 XSD 上。如果您将调试器附加到 Server Manager,您可以直接调试到您的扩展。请记住,您必须先注册服务器才能对其进行测试。
安装和注册 Shell Extension
您可以在 .NET Shell 扩展 - Shell Context Menus 的“安装和注册 Shell 扩展”部分中查看如何安装和注册这些扩展的详细信息 - 过程相同。
历史
- 2013 年 1 月 19 日:初始版本