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

时间:2008-09-22 21:05:47

标签: c# .net windows-shell

问题

语言:C#2.0或更高版本


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

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

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

更新


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

7 个答案:

答案 0 :(得分:6)

拒绝使用托管语言编写Shell扩展程序 - 如果您采用这种方式,可能会发生很多事情。

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

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

你回到非托管C / C ++这里是你唯一真正的工具。

答案 1 :(得分:2)

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

This thread包含对情况的一个很好的总结。

答案 2 :(得分:2)

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

Link To Info

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

首先,在C#中创建一个实现IShellExtInit IContextMenu接口的COM组件。如何在C#中创建COM组件的描述为herethis article中描述了如何实现必要的接口。虽然描述是针对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=...
        ...
祝你好运......

答案 6 :(得分:1)

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

I asked a similar question recently通过链接指向我完全想做的事情