如何为Windows创建自定义Shell上下文处理程序?

问题

语言:C#2.0或更高版本


当用户右键单击某些文件时(我的情况是* .eic),我想注册上下文处理程序来创建菜单。 从这些菜单中注册,注销(清理)和处理事件(点击)的过程是什么?

我有一个线索,它与Windows注册表有关,但考虑到.net中有多少东西,如果有方便的方法来做到这一点干净和简单,我不会感到惊讶。

代码片段,网站引用,评论都很好。 请把它们扔给我。

更新


显然,在托管语言中创建上下文菜单存在一些问题,正如一些用户所评论的那样。 是否有任何其他首选方法可以实现相同的行为,还是应该花时间研究这些变通方法? 我不介意这样做,我很高兴人们已经努力使这成为可能 – 但我仍然想知道是否有一个“适当/干净”的方式实现这一目标。

拒绝使用托管语言编写Shell Extensions – 如果您采用这种方式,有很多事情可能会爆炸。

浏览此主题以获取更多详细信息。 它包含了如果真的需要这样做的链接,以及为什么可以这样做的sagely建议,但不应该。

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1428326d-7950-42b4-ad94-8e962124043e/

你将回到非托管C / C ++作为你唯一真正的工具。

这不是一个好主意,因为不同版本的.NET Framework之间存在潜在的依赖性问题。 您的shell扩展可能需要一个版本,而当前正在运行的应用程序可能已加载了不同的版本。

该线程包含一个很好的情况摘要。

虽然其他人已经提到过,由于框架冲突,在纯.NET中编写shell扩展是一个坏主意,你仍然应该注意到:

  1. 有第三方驱动程序(请参阅Eldos或LogicNP)为您执行非托管端,允许您编写与本机驱动程序对话的托管代码,从而防止与shell相关的CLR版本冲突。

  2. 最近的一篇MSDN文章提到微软已经解决了Silverlight使用的CoreCLR这个问题。 他们通过允许CLR的多个版本在同一进程中运行来实现这一点,从而解决了问题。 作者进一步表示,Silverlight中的此修复程序将进入完整CLR的未来版本。 (意思是,将来在托管代码中编写shell扩展是非常可行的。)

我以前在C#中完成过它们。 它最终会变得比它应该的更难。 但是,一旦得到样板代码,很容易推出新项目。 我按照这个链接:

链接到信息

正如先前的评论所提到的,在托管语言中编写shell扩展并不是最好的想法,但我想我会分享一个开源项目就是这样:)

ShellGlue是一个托管的shell扩展,实际上非常有用。 如果您有兴趣在C / C ++中编写shell扩展,那么源代码也可能对您有所帮助。

除了已经提到的有关在托管代码中实现shell扩展的警告之外,您基本上需要做的是以下内容:

首先,在C#中创建一个实现IShellExtInit IContextMenu接口的COM组件。 此处描述了如何在C#中创建COM组件。 本文介绍了如何实现必要的接口。 虽然描述是针对C ++实现的,但您可以将该知识应用于C#版本。

您的COM组件将具有名为Class-ID或CLSID的GUID。 您需要将该ID与文件类型一起注册为上下文菜单shell扩展:

HKEY_CLASSES_ROOT\.eic\ShellEx\ContextMenuHandlers\MyShellExt (Default) -> {YOUR-COMPONENTS-CLSID} 

还要确保按照C#COM教程中的说明正确注册了组件。 你应该在注册表中找到它

 HKEY_CLASSES_ROOT\CLSID\{YOUR-COMPONENTS-CLSID} InprocServer32 (Default) -> C:\WINDOWS\system32\mscoree.dll Class -> YourImplClass assembly -> YourAssembly, version=..., Culture=neutral, PublicKey=... ... 

祝好运…

正如其他人所指出的,shell扩展目前在windows开发中并不实用。

我最近问了一个类似的问题 ,这个问题的答案是一个指南的链接,可以完全按我的意思去做