#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;
}
}
Комментарии:
1. На самом деле проблема не в этом. Я пытаюсь изменить наложение значка только тогда, когда что-то происходит с файлом из моего проекта winform. Например, я загружаю файл на веб-сайт, пока выполняется эта функция загрузки, я хочу наложить значок на файл, который загружается в систему. Но способ работы моего кода, когда я регистрирую dll в системе, проверяет наличие каждого файла папки и т.д. На компьютере, я просто хочу изменить overlayicon для файла, который я хочу динамически изменять из моего проекта winform
2. @Icarsel, не могли бы вы поделиться тем, как вы отображаете свой значок в своей winform?
3. я собираюсь показать изменения значка в оболочке, но только в определенных файлах, которые определяются приложением winform, на самом деле не будут отображаться в winform
4. @Icarsel, вы можете проверить мое обновление 1.