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

时间:2020-03-06 14:33:58  来源:igfitidea点击:

问题

语言:C2.0或者更高版本

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

我有一个线索,这与Windows注册表有关,但是考虑到.net中有多少内容,如果有方便的方法来进行此清洁和简便操作,我也不会感到惊讶。

代码段,网站参考,评论都很好。请把他们扔给我。

更新

显然,正如一些用户所评论的那样,用托管语言创建上下文菜单存在一个小问题。还有其他实现相同行为的首选方法,还是我应该花些时间研究这些解决方法?我完全不介意这样做,我很高兴人们为实现这一目标付出了很多努力,但我仍然想知道是否有"适当/清洁"的方式来实现这一目标。

解决方案

拒绝使用托管语言编写Shell Extensions,如果我们遵循这种方法,可能会发生很多事情。

浏览此线程以获取更多详细信息。它包含确实需要这样做的链接,以及关于为什么可以做到的明智建议,但不应这样做。

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

我们将回到非托管C / C ++,成为这里唯一的真正工具。

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

该线程很好地总结了这种情况。

我之前已经在C#中完成了它们。最终,这比应做的要难得多。但是,一旦记下样板代码,就很容易推出新项目。我点击了以下链接:

链接到信息

正如前面的评论所提到的,用托管语言编写shell扩展并不是最好的主意,但是我想我应该分享一个开源项目,就是这样做的:)

ShellGlue是一个托管的Shell扩展,实际上很有帮助。如果我们有兴趣追求用C / C ++编写shell扩展,那么该资源对我们也可能会有所帮助。

尽管其他人已经提到由于框架冲突,在纯.NET中编写shell扩展是一个坏主意,但我们仍应注意:

  • 那里有第三方驱动程序(请参阅Eldos或者LogicNP)为我们做非托管方面的工作,从而使我们可以编写与本机驱动程序对话的托管代码,从而防止与外壳相关的CLR版本冲突。
  • 最近的MSDN文章提到Microsoft已为Silverlight使用的CoreCLR解决了此问题。他们通过允许多个版本的CLR在同一进程中运行来实现此目的,从而解决了该问题。作者进一步指出,Silverlight中的此修复程序将被集成到完整CLR的未来版本中。 (意味着,将来,在托管代码中编写shell扩展将是完全可行的。)

除了已经提到的有关在托管代码中实现Shell扩展的警告之外,我们基本上需要做的是以下操作:

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

COM组件将具有称为Class-ID或者CLSID的GUID。我们需要使用文件类型将该ID注册为上下文菜单外壳扩展名:

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

还要确保按照CCOM教程中的说明正确注册了组件。我们应该在注册表下找到它

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

祝你好运...

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

最近我问了一个类似的问题,该问题的答案是指向指南的链接,该指南可以准确地完成我想做的事情