4

问题

语言:C# 2.0 或更高版本


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

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

代码片段、网站参考、评论都很好。请把它们扔给我。

更新


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

4

7 回答 7

6

拒绝用托管语言编写 Shell 扩展——如果你追求这条路线,会有很多事情发生。

浏览此线程以获取更多详细信息。如果真的需要,它包含可以执行此操作的链接,以及为什么可以执行但不应该执行此操作的明智建议。

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

你又回到了非托管 C/C++ 作为你这里唯一真正的工具。

于 2008-09-22T21:09:33.060 回答
2

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

这个线程包含一个很好的情况总结。

于 2008-09-22T21:12:44.987 回答
2

我以前在 C# 中做过。它最终变得比它应该的要困难得多。但是,一旦您获得了样板代码,就很容易推出新项目。我点击了这个链接:

链接到信息

于 2008-09-22T21:16:40.220 回答
2

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

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

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

于 2008-09-22T21:20:41.897 回答
1

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

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

于 2008-09-22T21:16:42.200 回答
1

除了提到的关于在托管代码中实现 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=...
        ...

祝你好运...

于 2009-03-04T15:42:55.040 回答
1

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

我最近问了一个类似的问题,得到了一个指南的链接来回答我想做的事情

于 2009-03-06T03:13:05.373 回答