无法使用C#在Shell扩展中添加图标

3
我发现了一篇非常好的教程,正在尝试理解其中没有涉及到的内容(因为教程本身运行良好)。像WinRar、TortoiseSVN、杀毒软件等应用程序中,Shell Extension Item 旁边都有一个图标。我想知道这是如何实现的。(使用 C# 编程)添加分隔符可以,添加子菜单也可以,点击操作也可以,但是我遇到了图标问题。这不可能那么难。有人能帮助我吗?请提供一些示例代码、教程或者甚至是可工作的代码片段。请不要说 Microsoft 不再支持 .NET 4.0 中的此项功能,因为这并不是保证,所以他们不提供示例代码。如果所有其他应用程序都能做到,那么这是可能的。

有趣的问题 - +1 并已加入收藏夹。 - Patrick D'Souza
3个回答

3
请查看以下文章,它使用.NET 4.0创建Windows Shell扩展,使用SharpShell nuget包。 NET Shell扩展 - Shell上下文菜单 使用此库,您可以在创建contextmenustrip时直接设置图像,如下所示。
protected override ContextMenuStrip CreateMenu()
{
    //  Create the menu strip.
    var menu = new ContextMenuStrip();

    //  Create a 'count lines' item.
    var itemCountLines = new ToolStripMenuItem
    {
        Text = "Count Lines...",
        Image = Properties.Resources.CountLines
    };

    //  When we click, we'll count the lines.
    itemCountLines.Click += (sender, args) => CountLines();

    //  Add the item to the context menu.
    menu.Items.Add(itemCountLines);

    //  Return the menu.
    return menu;
}

2
您只需要添加到以下注册表键:HKEY_LOCAL_MACHINE\SOFTWARE\Classes*\shellex\ContextMenuHandlers 这是代码:
 string TimeStamp = DateTime.Now.ToString("dd-MM-yyyy");

string key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\*\\shellex\\ContextMenuHandlers\\Winrar";
string valueName = "MyWinrar";
Microsoft.Win32.Registry.SetValue(key, valueName, HERE WHAT YOU WANT TO START, Microsoft.Win32.RegistryValueKind.String);

希望它对你有用!

0

你列出的所有应用程序都使用COM和非托管代码来创建覆盖图标处理程序。甚至有一个特殊的项目TortoiseOverlays,为TortoiceCSV,TortoiseSVN和TortoiseGIT绘制图标提供了一个公共库。您可以查看其源代码以了解如何完成此操作。如果您想绘制类似的图标,应该只需重复使用它。

不建议使用.Net进行此类型的扩展,因为当针对不同.Net版本构建的多个扩展尝试在资源管理器进程中加载时,它们将使资源管理器崩溃。


我当然不想使用Tortoise的图标;-) 但是我会用自己的..但是谢谢,我会查看他们的库。 - stackr
还要注意,系统对图标数量有限制,大约为15个。任何一只Tortoise使用约8-10个,某些文件同步工具可能会使用另外4-5个。所有未能达到此限制的覆盖物都将不会被绘制。 - alex
我计划只使用1个,所以这不会是问题 :-) - stackr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接