IconOverlayHandler не накладывает значок файла

#c# #winforms #shell #sharpshell

#c# #winforms #оболочка #острая скорлупа #sharpshell

Вопрос:

 namespace SyncFileIconOverlay
{
[ComVisible(true)]
public class SyncFileIconOverlay:SharpIconOverlayHandler
{
   
    protected override int GetPriority()
    {
        //  The read only icon overlay is very low priority
        return 90;
    }

    public int PriorityGetter()
    {
        return GetPriority();
    }

    protected override bool CanShowOverlay(string path, FILE_ATTRIBUTE attributes)
    {
        try
        {
            //  Get the file attributes
            var fileAttributes = new FileInfo(path);

            //  Return true if the file is read only, meaning we'll show the overlay
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

    public bool CanShowOverlayGetter(string path)
    {
        return CanShowOverlay(path, FILE_ATTRIBUTE.FILE_ATTRIBUTE_NORMAL);
    }

    protected override System.Drawing.Icon GetOverlayIcon()
    {
        //  Return the read only icon
        return Properties.Resources.ReadOnly;
    }

    public System.Drawing.Icon OverlayIconGetter()
    {
        return GetOverlayIcon();
    }

   }
}
  

Я использую приведенный выше код, который я нахожу изhttps://www.codeproject.com/Articles/545781/NET-Shell-Extensions-Shell-Icon-Overlay-Handlers

это в библиотеке классов, и я ссылаюсь на эту DLL из моего приложения winform, когда мне нужно наложить значок, я вызываю PriorityGetter, затем проверяю с помощью CanShowOverlayGetter, наконец, вызываю OverlayIconGetter, если функция CanShowOverlay возвращает true для файла, она изменяет значок наложения, но проблема в том, что система использует это для каждого файла на моем компьютере, и я ничего не делаю, когда я регистрирую dll и перезапускаю проводник, изменения применяются, но я хочу проверить и измените наложение значков из проекта winform, который загружает файлы, которые я хочу наложить на те файлы, которые динамически поступают из программы. У вас, ребята, есть какие-либо идеи, как я могу этого добиться спасибо!!!

Комментарии:

1.Значки и наложения значковСоздание обработчиков расширений оболочки

2. @Jimi Я действительно не понимаю, как эти статьи помогут мне, я уже создал обработчик

3. Эти документы содержат пошаговую информацию о том, как создавать и регистрировать обработчики наложения значков, чтобы вы могли шаг за шагом проверить, правильно ли работает ваш обработчик. Например, я не вижу там GetOverlayInfo() метода. Это то, что вы должны предоставить. IsMemberOf() там тоже нет, но это может быть частью библиотеки, о которой вы упомянули. Проверьте это тоже. и т.д. Вы также сказали, что видите 12 уже зарегистрированных обработчиков. Посмотрите, существует ли максимальное количество потенциальных обработчиков наложения значков.

4. OverlayIconGetter возвращает значок, такой же, как getoverlayinfo, а memberof si в принципе может отображать overlay. Существует 15 обработчиков наложения значков, если я не ошибаюсь, но я не знаю, как вызвать эти функции и т.д.

5. Когда я немного поиграл с регистрами, значок каждого файла на моих компьютерах стал тем, что у меня было для моего собственного iconoverlayerhandler, но мне нужно применить изменение только к определенному файлу, я действительно смущен этой проблемой

Ответ №1:

Вам нужно немного поработать, прежде чем ваше наложение значков сработает из-за ограничения. Вы можете проверить это здесь, чтобы наложение значков отображалось в Windows 7 и Windows 10.

… имеет жесткий предел в 15 наложений. В реестре есть список, и независимо от того, сколько приложений устанавливают оверлеи, используются только первые 15. Остальные игнорируются.

Обновление 1
Я не смог найти лучшего способа сделать это через file. Но в этом примере будет отображаться значок наложения на определенную папку.

Шаг 1. Установите файловый маркер, который можно скрыть. В моем примере у меня есть .marker это просто пустой файл.

Шаг 2: Ваш обработчик значков наложения.

 [ComVisible(true)]
public class FileValidIconOverlayHandler : SharpIconOverlayHandler
{
    protected override int GetPriority()
    {
        return 10;
    }

    protected override bool CanShowOverlay(string path, FILE_ATTRIBUTE attributes)
    {
        var file = new FileInfo(path);
        var hasFileMarker = file.Directory.GetFiles(".marker").Length > 0;
        var isNotFileMarker = file.Name != ".marker";
        var isNotDirectory = !file.Attributes.HasFlag(FileAttributes.Directory);

        return hasFileMarker amp;amp; isNotFileMarker amp;amp; isNotDirectory;
    }

    protected override System.Drawing.Icon GetOverlayIcon()
    {
        return Properties.Resources.Valid;
    }
}
  

Вывод с .marker
введите описание изображения здесь

Вывод без .marker
введите описание изображения здесь

Комментарии:

1. На самом деле проблема не в этом. Я пытаюсь изменить наложение значка только тогда, когда что-то происходит с файлом из моего проекта winform. Например, я загружаю файл на веб-сайт, пока выполняется эта функция загрузки, я хочу наложить значок на файл, который загружается в систему. Но способ работы моего кода, когда я регистрирую dll в системе, проверяет наличие каждого файла папки и т.д. На компьютере, я просто хочу изменить overlayicon для файла, который я хочу динамически изменять из моего проекта winform

2. @Icarsel, не могли бы вы поделиться тем, как вы отображаете свой значок в своей winform?

3. я собираюсь показать изменения значка в оболочке, но только в определенных файлах, которые определяются приложением winform, на самом деле не будут отображаться в winform

4. @Icarsel, вы можете проверить мое обновление 1.