65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET Shell Extensions - Shell Drop Handlers (拖放处理程序)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (15投票s)

2013 年 1 月 19 日

CPOL

7分钟阅读

viewsIcon

59293

downloadIcon

2299

使用 .NET 快速创建 Shell Drop Handler 扩展

引言

Shell Drop Handler 是在系统中注册的 DLL,用于扩展 Shell 中的拖放功能。您可以使用这些扩展来允许文件成为其他文件的放置目标,或者利用标准的拖放功能来调用您自己的业务逻辑。在本文中,我将向您展示如何使用 .NET 和一个名为 SharpShell 的库来创建 Drag Handler 扩展。

我们将创建的 Drag Handler 将允许用户将 XML 文件拖放到 XSD 文件上,并根据 XSD 架构验证 XML 文件内容。下面是它的样子。

上图:我们将两个 XML 文件拖放到 XSD 文件上 - 扩展程序会启动并显示“Link”视觉提示。

上图:用户松开鼠标,扩展程序根据 XSD 验证 XML 文件,并在对话框中显示结果。

系列文章

本文是 '.NET Shell Extensions' 系列的一部分,该系列包括

  1. .NET Shell Extensions - Shell Context Menus (右键菜单扩展)
  2. .NET Shell Extensions - Shell Icon Handlers (图标处理程序)
  3. .NET Shell Extensions - Shell Info Tip Handlers (信息提示处理程序)
  4. .NET Shell Extensions - Shell Drop Handlers (拖放处理程序)
  5. .NET Shell Extensions - Shell Preview Handlers (预览处理程序)
  6. .NET Shell Extensions - Shell Icon Overlay Handlers (图标叠加处理程序)
  7. .NET Shell Extensions - Shell Thumbnail Handlers (缩略图处理程序)
  8. .NET Shell Extensions - Shell Property Sheets (属性表处理程序)

步骤 1:创建项目

首先,创建一个新的 C# 类库项目。

提示:您可以使用 Visual Basic 而不是 C# - 在本文中,源代码是 C#,但创建 Visual Basic Shell Extension 的方法是一样的。

在此示例中,我们将项目命名为 'XsdDropHandler'。将 'Class1.cs' 文件重命名为 'XsdDropHandler.cs'。

现在添加以下引用

  1. System.Windows.Forms
  2. 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 类派生自 SharpDropHandlerSharpDropHandler 是 Drop Handler Shell 扩展的基类 - 它将提供所有必需的 COM 管道和互操作 - 我们只需实现几个抽象成员来提供业务逻辑。所以您的类看起来应该像这样

public class XsdDropHandler : SharpDropHandler
{
} 

对于 drop handler,基类中有两个抽象函数,我们必须在派生类中实现它们。

DragEnter

protected abstract void DragEnter(DragEventArgs dragEventArgs);

当用户选择了一些 shell 项并将其拖放到您注册了扩展的 shell 项上时(因此在我们的例子中,当用户将任何东西拖放到 XSD 文件上时),就会调用 DragEnter。您必须在 DragEnter 函数中执行以下操作

  1. 检查正在拖动的文件的集合(这些文件位于 'DragItems' 成员中)。
  2. 根据您允许的拖动操作,将 dragEventArgs.Effect 成员设置为您允许的效果。

因此,例如在我们的 drop handler 中,我们将确保每个拖动的都是 XML 文件。如果都是 XML 文件,我们将把拖动效果设置为“link”。

Drop

protected abstract void Drop(DragEventArgs dragEventArgs);

当用户释放鼠标并需要调用实际功能时,将调用 DropDragEventArgs 提供了以防您需要查看正在按下的键或鼠标位置等内容。

在我们的示例中,我们将在该函数中打开验证窗体。

第 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 日:初始版本
© . All rights reserved.