2011-03-27 52 views
4

因此,我搜索了如何使用C#将应用程序集成到应用程序(将其添加到右键单击菜单)的指南,但我找不到如何做到这一点对于特定的文件类型。我知道这是可能的,因为WinRar可以做到这一点。那我该怎么做?Shell在Windows中与C#进行特定文件类型的集成

回答

7

通常有两种方式可以实现这一点。

  1. 注册表键 - 您可以在HKEY_CLASSES_ROOT下编写键和值。如果你看一下这个配置单元,你会在你的电脑上看到扩展名。有关密钥和值的详细信息,请看article。有一些简单的选项,可以在这里用你的应用程序打开.myfile类型。这里是一个File Association Example

  2. 外壳扩展(在COM书面):在这里,你可以做更复杂的东西一样Handlers.,他们将获得由Windows调用,所以你可以做这样的事情在菜单上的油漆,或添加自定义操作时,文件右键点击。这里比文件还多,你甚至可以添加属性表和自定义工具提示。

有关不使用.NET编写Shell处理程序**的一些talk。这仅适用于较旧的版本的.NET。 Its all ok with .NET4.

这篇文章应该可以帮助您与Context Menu Handler in .NET4

**为什么它不建议:

当你写一个shell处理程序,它就会由主机进程调用(一般为Windows资源管理器) ,但也包括FileOpenDialogs和FolderBrowser对话框。因此,如果你在.NET 2.0中编写了一个外壳扩展,以及一个称为文件打开对话框的.NET 1.1应用程序,然后调用.NET 2.0 shell处理程序,并且您的.NET 1.1应用程序具有较旧的CLR,则会出现问题并会有版本冲突。

所以我很高兴地发现了最后,这已经是.NET 4莫名其妙固定=)

+0

在如此多的进程中加载​​.net资源仍然存在资源浪费。 – CodesInChaos 2011-03-27 19:01:43

+0

你的意思是当.NET处理程序被注入主机进程?嗯,我猜。但** ** ** .NET的一个+1将是它比C++更容易编写和维护的代码。 (至少对我来说):)我记得Michael Dunn或Shell Handlers在C++中的这一系列文章,我在几年前尝试阅读它们,但它很难掌握。 – gideon 2011-03-27 19:04:08

+0

问题是,有几十个主机进程就像记事本一样非常便宜,现在已经承担了整个CLR的负担。增加了很多。 – CodesInChaos 2011-03-27 19:08:43

1

Windows资源管理器右键菜单由注册表控制。特别是,HKEY_CLASSES_ROOT配置单元。

一个很好的方式来得到一个好主意如何在那里的一切工作是检查出HKCR\.txt它显示了右键菜单中的文本文件会发生什么。查看指向“txtfile”的(默认)键。然后HKCR\txtfile将有一个子项HKCR\txtfile\shell\open\comman d。 (默认)键显示打开notepad.exe的命令,其参数为“%1”,表示正在打开的文件。用其他名称替换打开的键(请参阅txtfile键中的打印和打印键)以将其他自定义命令添加到右键单击菜单。

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