【问题标题】:How can I create my custom Shell Context Handlers for Windows?如何为 Windows 创建自定义 Shell 上下文处理程序?
【发布时间】:2008-09-22 21:05:46
【问题描述】:

问题

语言:C# 2.0 或更高版本


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

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

代码sn-ps、网站参考、cmets都不错。请把它们扔给我。

更新


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

【问题讨论】:

    标签: c# .net windows-shell


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

    This thread 很好地概括了情况。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        Link To Info

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            除了已经提到的关于在托管代码中实现 shell 扩展的注意事项之外,您基本上需要做的是以下几点:

            首先,在 C# 中创建一个实现 IShellExtInit IContextMenu 接口的 COM 组件。 here 描述了如何在 C# 中创建 COM 组件。 this 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=...
                    ...
            

            祝你好运……

            【讨论】:

              【解决方案7】:

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

              I asked a similar question recently 得到了一个指向指南的链接来回答我想做的事情

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-12
                • 1970-01-01
                • 2019-12-20
                • 1970-01-01
                • 2011-06-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多