c# - IconOverlayHandler 不覆盖文件的图标
问题描述
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找到的上述代码
这是在一个类库中,当我需要overlayicon时,我从我的winform应用程序中引用这个dll我正在调用PriorityGetter然后检查CanShowOverlayGetter最后调用OverlayIconGetter,如果CanShowOverlay函数为文件返回true,它会更改覆盖图标但问题当我注册 dll 并重新启动资源管理器更改应用时,系统是否对我计算机中的每个文件都使用它,而我没有做任何事情,但我想从一个上传和下载我想要制作图标覆盖的文件的 winform 项目中检查和更改图标覆盖在那些来自程序的动态文件上。你们有什么想法我怎么能做到这一点谢谢!!!
解决方案
由于限制,您需要在图标覆盖工作之前进行一些工作。您可以在此处查看在 Windows 7 和 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;
}
}
推荐阅读
- javascript - 识别谁触发了函数
- nativescript - Nativescript RadSideDrawer - 任何让它可拖动的方法?
- html - 当光标在顶部并且页面向下滚动时,导航栏幻灯片不会卡住
- nestjs - 如何在 Nestjs 中使用特定于路由的 express 中间件?
- c++ - 使用堆栈查找每个元素的下一个较大值
- swift - 如何使用 FireStore 和 Cloud 功能创建开发环境
- javascript - CSS变换旋转在Internet Explorer 11中不起作用
- angular - 如何在按钮中执行 routerLink 之前执行事件
- python - 反复查找帐户
- r - Rstudio 加载和安装包时出错(ANN2 和其他神经网络包)