【问题标题】:IconOverlayHandler Doesn't overlay icon of the fileIconOverlayHandler 不覆盖文件的图标
【发布时间】:2020-09-04 10:25:43
【问题描述】:
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找到的代码

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

【问题讨论】:

  • @Jimi 我真的不明白这些文章对我有什么帮助我已经创建了处理程序
  • 这些文档包含有关如何创建和注册图标覆盖处理程序的分步信息,因此您可以逐步验证您的处理程序是否行为正确。例如,我在那里看不到 GetOverlayInfo() 方法。这是你应该提供的东西。 IsMemberOf() 也不存在,但它可能是您提到的库的一部分。也验证一下。等等。您还说您看到了 12 个已注册的处理程序。查看是否存在最大数量的潜在图标叠加处理程序。
  • OverlayIconGetter 返回的图标和getoverlayinfo 一样,memberof si 基本上可以显示overlay。如果我没记错的话,有 15 个图标叠加处理程序,但我不知道如何调用这些函数等。
  • 当我稍微使用寄存器时,我的计算机图标中的每个文件都变成了我自己的 iconoverlayerhandler 所拥有的,但我只需要将更改应用于特定文件,我真的对这个问题感到困惑

标签: c# winforms shell sharpshell


【解决方案1】:

由于限制,您需要进行一些工作才能使您的图标叠加层起作用。你可以在这里查看Making Icon Overlays Appear In Windows 7 and Windows 10

...有 15 个叠加层的硬性限制。注册表中有一个列表, 而且无论有多少应用安装了叠加层,只有前 15 个是 用过的。其余的被忽略。

更新 1
我找不到更好的方法来通过文件来做到这一点。但此示例将在特定文件夹上显示叠加图标。

第 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的输出

【讨论】:

  • 这实际上不是问题。只有当我的 winform 项目中的文件发生问题时,我才尝试更改图标覆盖。例如,我正在将文件上传到网站,而此上传功能正在进行中,我想用图标覆盖正在上传到系统的文件。但是,当我将 dll 注册到系统时,我的代码工作方式会检查计算机中的每个文件夹文件等,我只想更改要从我的 winform 项目动态更改的文件的 overlayicon
  • @Icarsel,你能分享一下你是如何在你的 winform 上显示你的图标的吗?
  • 我将在 shell 上显示图标更改,但仅限于由 winform 应用程序确定的特定文件,实际上不会显示在 winform 上
  • @Icarsel,你可以查看我的更新 1。
猜你喜欢
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2021-06-08
  • 2021-08-20
  • 2012-04-08
相关资源
最近更新 更多