IconOverlayHandler 不覆盖文件的图标

IconOverlayHandler Doesn't overlay icon of the file

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

中找到的上面的代码

这是在 Class 库中,当我需要覆盖图标时,我从我的 winform 应用程序中引用了这个 dll 我正在调用 PriorityGetter 然后检查 CanShowOverlayGetter 最后调用 OverlayIconGetter,如果 CanShowOverlay 函数返回 true一个文件它改变了覆盖图标但问题是系统将它用于我计算机中的每个文件而我没有做任何事情当我注册 dll 并重新启动资源管理器更改应用时,但我想检查并更改来自 winform 项目的图标覆盖上传和下载文件我想让图标覆盖在程序动态提供的那些文件上。你们知道我怎样才能做到这一点谢谢!!!

由于限制,您需要做一些工作才能使图标覆盖生效。你可以在这里查看 Making Icon Overlays Appear In Windows 7 and Windows 10.

...have a hard limit of 15 overlays. There’s a list in the registry, and no matter how many apps install overlays, only the first 15 are used. The rest are ignored.

更新 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 && isNotFileMarker && isNotDirectory;
    }

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

输出 .marker

没有.marker
的输出