Невозможно добавить значок в расширение оболочки с помощью С#

Я нашел очень хороший туториал и пытаюсь понять то, чего нет в этом туториале (потому что сам туториал работает нормально) http://www.codeproject.com/Articles/9163/File-Rating-a-practical-example-of-shell-extension< /а>

Когда вы смотрите на такие приложения, как WinRar, TortoiseSVN, антивирусные приложения и многие другие, рядом с элементом расширения оболочки есть значок.

Я хотел бы знать, как это делается. (Программно с C#)

Добавление разделителя работает, добавление подменю работает, щелчок + действие также работает, но я борюсь со значком. Это не может быть так сложно. Кто-нибудь может мне помочь?

И, пожалуйста, не говорите, что Microsoft больше не поддерживает это в .NET 4.0, потому что это не гарантируется, и поэтому они не предоставляют образец кода. Если все эти другие приложения могут это сделать, то это возможно.

Пожалуйста, предоставьте мне пример кода, несколько руководств или, может быть, даже рабочий код.


person stackr    schedule 24.04.2013    source источник
comment
Интересный вопрос - +1 и в избранное.   -  person Patrick D'Souza    schedule 25.04.2013


Ответы (3)


Пожалуйста, ознакомьтесь со следующей статьей, в ней используется .NET 4.0 для создания расширений оболочки Windows с помощью SharpShell пакет nuget.

Расширения NET Shell — Контекстные меню оболочки

Используя эту библиотеку, вы можете установить изображение непосредственно при создании контекстного меню, как показано ниже.

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;
}
person Patrick D'Souza    schedule 24.04.2013

Вам нужно только добавить в следующий раздел реестра: 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);

я надеюсь, что это работает для вас!

person Yogibear    schedule 21.01.2014

Все перечисленные вами приложения используют COM и неуправляемый код для создания обработчиков значков наложения. Существует даже специальный проект TortoiseOverlays, предоставляющий общую библиотеку для рисования иконок для TortoiceCSV, TortoiseSVN и TortoiseGIT. Вы можете взглянуть на его исходный код, чтобы узнать, как это делается. Если вы хотите нарисовать похожие значки, вам, вероятно, следует просто использовать их повторно.

Использование .Net для этого типа расширений не рекомендуется, потому что, когда несколько расширений, созданных для разных версий .Net, попытаются загрузиться в процессе проводника, это приведет к сбою проводника.

person alex    schedule 24.04.2013
comment
Конечно, я не хочу использовать иконки Tortoise ;-), но свои собственные.. но спасибо, я посмотрю их библиотеки. - person stackr; 24.04.2013
comment
Также имейте в виду, что существует системное ограничение на общее количество значков - около 15. Любая черепаха будет использовать около 8-10, некоторые инструменты синхронизации файлов могут использовать еще 4-5. Все оверлеи, не уложившиеся в это ограничение, не будут отрисованы. - person alex; 24.04.2013
comment
Я планирую использовать только 1, так что это не будет проблемой :-) - person stackr; 24.04.2013