使用C#在Windows中为特定文件类型集成Shell

4

我搜索了一份关于如何在C#中进行应用程序shell集成(将其添加到右键菜单)的指南,但我没有找到只针对特定文件类型执行此操作的方法。我知道这是可能的,因为WinRar就可以实现。那么我该怎么做呢?

2个回答

7

通常可以有两种方式来实现这个。

  1. 注册表键 - 您可以在 HKEY_CLASSES_ROOT 下编写键和值。如果您查看该项,您将看到计算机上的扩展名。查看此文章以获取有关键和值的详细信息。在这里可以实现一些简单的选项,例如使用您的应用程序打开 .myfile 类型。这是一个文件关联示例

  2. Shell 扩展(使用 COM 编写):在这里,您可以执行更复杂的操作,如处理程序。它们将由 Windows 调用,因此您可以做一些诸如在菜单上绘制或添加自定义操作等操作,当右键单击文件时。这里比文件还要多,您甚至可以添加属性表和自定义工具提示。

您会发现一些关于不使用.NET编写Shell处理程序的讨论。这仅适用于早期版本的.NET。.NET4没有问题。

本文应该能够帮助您在.NET4中创建上下文菜单处理程序

** 为什么不建议使用:

当您编写Shell处理程序时,它会被主机进程(通常是Windows资源管理器)调用,但也会被FileOpenDialogs和FolderBrowser对话框等其他东西调用。因此,如果您在.NET 2.0中编写了一个Shell扩展,然后.NET 1.1应用程序调用了文件打开对话框,那么您的.NET 2.0 Shell处理程序将被调用,并且存在旧版CLR的.NET 1.1应用程序中将出现版本冲突。

我很高兴地发现这个问题在.NET 4中得到了解决 =)


在这么多进程中加载 .net 仍然存在资源浪费的问题。 - CodesInChaos
你的意思是当.NET处理程序注入到宿主进程中时吗?嗯,我想是这样。但我的看法是,相比C ++,.NET的优势在于编写和维护代码更容易。(至少对我来说是这样):) 我记得Michael Dunn或Shell Handlers的一系列文章,我几年前曾尝试阅读它们,但很难理解。 - gideon
问题在于有几十个主机进程(如记事本)通常非常便宜,现在却承担了整个CLR的负担。这加起来相当多。 - CodesInChaos
哦,这里有:编写Shell扩展的完全白痴指南-第一部分共七部分。还有人很厉害/可怕地将该文章重新以汇编语言的方式进行了撰写,点击此处查看 here - gideon

1

Windows资源管理器右键菜单由注册表控制,具体来说是HKEY_CLASSES_ROOT。

了解其中所有内容的好方法是查看HKCR\.txt,它显示右键菜单中文本文件将发生什么。查看(默认)键,它指向“txtfile”。然后,HKCR\txtfile将有一个子键HKCR\txtfile\shell\open\command。该键的(默认)键显示打开notepad.exe的命令,参数为“%1”,表示正在打开的文件。将打开键替换为其他名称(请参见txtfile键中的print和printto键),以添加不同的自定义命令到右键菜单。

一旦您掌握了需要添加以集成应用程序的内容,就可以查看Microsoft.Win32 namespace,以获取帮助通过c#代码操作注册表的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接