目录
介绍
本文档提供了有关如何在Windows环境中实现Windows资源管理器外壳扩展的详细概述。它涉及开发和安装实践。
目的
本文档提供了有关如何将自己的自定义扩展集成到您自己的Windows环境中的全面技术概述——涉及哪些组件以及它们如何相互关联。
范围
本文档的范围是传达使用SharpShell程序集生成Windows扩展所需的概念。
先决条件
- 对OOD(尤其是继承)有很好的理解
- 对.NET Framework(4.0+)有很好的理解
- 有关如何注册程序集的知识
- 有关使用Visual Studio的知识
- 了解Microsoft COM
我们正在努力实现的目标
您可以在Windows资源管理器中文件的上下文菜单中看到一个名为“重复文件”的新(自定义)菜单选项。此选项将复制所选文件,因此您不必复制和粘贴。
代码和环境设置
代码库
使用此链接克隆代码存储库 GitHub - Bert0Neill/Extensions。
ShellExView
导航到以下位置,下载并解压ShellExView缩应用程序。解压缩后,您只需运行可执行文件 shexview.exe。这将加载所有已注册的程序集(在本地环境中)。
您可以使用此应用程序(刷新后)查找新创建的程序集,并验证它是否已正确注册。
服务器管理器
导航到以下位置,下载并解压缩ServerManager.zip文件(采用最新版本):
服务器管理器对于从GUI角度安装/卸载Windows资源管理器命令行管理程序扩展非常有用,此外,你可以轻松查看它是x64还是x86程序集以及它在哪里安装了扩展。
设计自定义窗口资源管理器上下文菜单扩展
在Visual Studio中加载项目(上面的链接),在开发自己的扩展时,可以将其用作指南。
- 创建一个空解决方案,并向其中添加新的类库项目(面向.NET 4.8框架)。
- 重命名默认的 Class.cs 文件以反映新扩展的功能。
就我而言,我将使用Windows资源管理器的上下文菜单创建一个将复制文件的扩展名。
我添加了一个资源文件来保存我希望在UI中呈现的任何字符串和图标:
将以下引用添加到Class项目中:
- System.Windows.Forms
- System.Drawing
System.Windows.Forms是必需的,因为我们将使用WinForms ContextMenuStrip来定义上下文菜单。
System.Drawing是必需的,因为我们想要使用图标。
添加SharpShell Nuget包
将 SharpShell Nuget包添加到类库项目中。这个组件为我们做了很多管道,你可以创建更多,而不仅仅是使用这个包的ContextMenu选项。
查看SharpShell Git Hub站点和特定ContextMenu链接,了解扩展还可以执行哪些操作。
- GitHub - dwmkerr/sharpshell: SharpShell makes it easy to create Windows Shell Extensions using the .NET Framework.
- https://github.com/dwmkerr/sharpshell/blob/main/docs/context-menu.md
- https://github.com/dwmkerr/sharpshell/blob/main/SharpShell/SharpShell/SharpContextMenu/SharpContextMenu.cs
代码说明
在第12行,您将继承SharpContextMenu abstract类并覆盖ContextMenuStrip函数(第31行)和CanShowMenu函数(第20行)。
在CanShowMenu函数中,您可以将自定义逻辑放置到是否要显示菜单选项(例如,您可能不希望复制大文件或某个用户创建的文件)
在SharpContextMenu函数内的第45行,您连接菜单选项的单击事件操作,在本例中,该操作调用我们的自定义函数以复制文件。
另请注意,在第 11行,我已将association属性设置为所有文件,因为我希望复制所有文件类型(不是文件夹等)——但您可以将其限制为.txt或.docx文件扩展名。
在第10行,我们告诉编译器使此类对COM注册表可见。
DuplicateFiles函数中要注意的一件事是public SelectedItemPaths IEnumerable<string>属性(第70行),它将保存所有选定的文件对象。
为您的项目强签名
在注册程序集之前,必须通过为程序集创建唯一标识来强类型化程序集,并且可以防止程序集冲突。
打开项目的属性窗格,选择“签名”,然后从“选择字符串名称”下拉列表中选择“新建”。
输入密钥名称(可以是任何内容),在此示例中,我没有选择使用密码,但如果在网络域中注册扩展,则应对其进行密码保护。
下面,您可以看到我称我的密钥名称为 SignedKey。
编译项目以进行调试
当你对代码感到满意并添加了强类型键时,就可以编译和测试扩展了——在调试模式下执行此操作。
注册和注销程序集
打开服务器管理器并选择加载服务器选项。导航到调试文件夹并加载新编译的shell扩展。
要注册\注销程序集(Shell扩展),只需在主窗口窗格中单击上传的文件,然后选择“服务器”菜单选项并选择“安装”或“卸载”。
注意:在安装或卸载程序集之前,必须在窗口窗格中选择文件。
您将收到一个提示,指示您的程序集已成功注册\未注册。
如果现在在窗口窗格中单击shell扩展文件,您将看到有关安装位置和版本的更多信息,当您取消注册时,这些字段将被重置。
要卸载您的shell扩展(以便您可以修改代码并重新测试),只需单击卸载选项(再次,如果您单击程序集,您会注意到安装文件夹已被重置)。
验证程序集是否已注册
如果要查看有关已注册程序集的详细信息,请打开ShellExView应用程序(如果已打开,则刷新),然后搜索新添加的扩展。如果它不存在,则它没有正确注册。
注意:您会注意到某些行是红色的,这是因为它们不是Microsoft开发的程序集(因此您的自定义程序集也将显示为红色)。
测试Windows资源管理器外壳扩展
安装扩展(通过服务器管理器)后,打开Windows资源管理器并右键单击文件,这将显示上下文菜单,你现在应该看到你的自定义扩展。
如果单击“复制文件”上下文菜单选项,将创建一个新文件。显示提示只是为了完整性(在实时版本中不是必需的)。
readme.txt 文件已多次复制(注意不要重复文件名)。
Visual Studio中的调试Shell扩展
- 打开Windows资源管理器(您将使用它进行测试)。
- 在Visual Studio中,将项目附加到资源管理器进程。
- 在代码中要调试的部分放置断点。
在Windows资源管理器中,右键单击文件并选择上下文菜单选项“复制文件”,这将触发调试器以命中断点。
https://www.codeproject.com/Articles/5353060/Design-a-Windows-Explorer-Extension-with-SharpShel