【发布时间】: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