本文档旨在为提供一个全面的技术概述,介绍如何将自定义扩展集成到Windows环境中,包括涉及的组件及其相互关系。
本文的目的是传达使用SharpShell组件创建Windows扩展所需的概念。
本文的范围是传达使用SharpShell组件创建Windows扩展所需的概念。
在开始之前,需要具备以下知识:
目标是在Windows资源管理器的文件上下文菜单中添加一个新的(自定义)菜单选项,称为“复制文件”。这个选项将复制选定的文件,这样就不必复制粘贴了。
使用以下链接克隆代码库:
https://github.com/Bert0Neill/Extensions.git
或者下载源代码作为压缩文件。
访问以下位置,下载并解压缩ShellExView应用程序。解压缩后,只需运行可执行文件shexview.exe。这将加载本地环境中注册的所有程序集。
https://www.nirsoft.net/utils/shexview.html
可以使用这个应用程序(刷新后)来找到新创建的程序集,并验证它是否正确注册。
访问以下位置,下载并解压缩ServerManager.zip文件(选择最新版本):
https://github.com/dwmkerr/sharpshell/releases
Server Manager对于从GUI角度安装/卸载Windows资源管理器Shell扩展非常有用,还可以轻松查看它是x64还是x86程序集以及它在哪里安装了扩展。
在Visual Studio中加载项目(上面的链接),可以使用这个作为开发自己的扩展的指南。
创建一个空白解决方案,并添加一个新的类库项目(针对.NET 4.8框架)。
将默认的Class.cs文件重命名为反映新扩展的功能。
在案例中,将创建一个通过Windows资源管理器的上下文菜单复制文件的扩展。
添加了一个资源文件来保存希望在UI中呈现的任何字符串和图标:
向Class项目添加以下引用:
System.Windows.Forms是必需的,因为将使用WinForms ContextMenuStrip来定义上下文菜单。
System.Drawing是必需的,因为将想要使用图标。
向类库项目添加SharpShell Nuget包。这个程序集为做了很多管道工作,可以使用这个包创建不仅仅是上下文菜单选项。
查看SharpShell GitHub网站,以及特定的ContextMenu链接,看看扩展还可以做什么。
https://github.com/dwmkerr/sharpshell
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抽象类,并覆盖ContextMenuStrip函数(第31行)和CanShowMenu函数(第20行)。
在CanShowMenu函数中,可以放置自定义逻辑来决定是否显示菜单选项(也许不希望复制大文件,或者由某个特定用户创建的文件等)。
在SharpContextMenu函数中的第45行,正在为菜单选项设置点击事件动作,在这个案例中,它调用自定义函数来复制文件。
还请注意,在第11行,将关联属性设置为所有文件,因为希望复制所有文件类型(而不是文件夹等)——但可以将其限制为.txt或.docx文件扩展名。
在第10行,告诉编译器使这个类对COM注册表可见。
在DuplicateFiles函数中要注意的一件事是public SelectedItemPaths IEnumerable
在可以注册程序集之前,它必须通过创建唯一身份来强类型化,并且可以防止程序集冲突。
打开项目的属性窗格,选择签名,然后从选择字符串名称下拉菜单中选择新建。
输入一个密钥名称(这可以是任何东西),在这个例子中,没有选择使用密码,但如果在网络域内注册扩展,它应该是密码保护的。
下面,可以看到将密钥名称称为SignedKey。
当对代码满意并且已经添加了强类型密钥后,就可以编译并测试扩展了——在调试模式下进行。
打开Server Manager并选择Load Server选项。导航到Debug文件夹并加载新编译的shell扩展。
要注册/注销程序集(Shell Extension),只需在主窗口窗格中点击上传的文件,然后选择Server菜单选项并选择Install或Uninstall。
注意:在安装或卸载程序集之前,必须在窗口窗格中选择文件。
将收到一个提示,表明程序集已成功注册/注销。
如果现在点击窗口窗格中的shell扩展文件,将看到有关安装位置和版本以及何时注销时这些字段将被重置的更多信息。
要卸载shell扩展(以便可以修改代码并重新测试),只需点击Uninstall选项(再次,如果点击程序集,将注意到安装文件夹已被重置)。
如果想查看有关注册的程序集的更多信息,请打开ShellExView应用程序(如果已经打开,请刷新),并搜索新添加的扩展。如果它不在那里,那么它没有正确注册。
注意:会注意到一些行是红色的,那是因为它们不是由Microsoft开发的程序集(所以自定义程序集也将是红色的)。
一旦通过Server Manager安装了扩展,打开Windows资源管理器并右键单击一个文件,这将显示上下文菜单,现在应该可以看到自定义扩展。
如果点击Duplicate File上下文菜单选项,将创建一个新文件。显示一个提示只是为了完整性(在实时版本中不必要)。
readme.txt文件已经被复制了几次(注意不要复制文件名)。
打开Windows资源管理器(将使用这个进行测试)。
在Visual Studio中,将项目附加到资源管理器进程。
在希望调试的代码部分放置断点。