为什么 Windows 将图标覆盖限制为 15 个?

为什么 Windows 将图标覆盖限制为 15 个?

我们可以看到无数关于 Dropbox 与 TortoiseSVN 以及许多其他应用程序图标覆盖冲突的问题。

两个例子:
为什么图标覆盖(来自第三方应用程序)没有显示在 Win8 资源管理器中?
我可以阻止覆盖图标的改变吗?

就我而言,我只有 Dropbox 和 TortoiseSVN。Dropbox 确实变得很烦人 - 每次更新后,我都需要运行我编写的脚本,从注册表中删除 Dropbox 的覆盖,然后重新启动 Windows 资源管理器。

我理解 Windows 将覆盖限制为 15 可能是出于性能考虑。
但是,增加到 25~35 会造成巨大的性能影响吗?
为什么微软还没有意识到这是一个非常普遍的问题并尝试修复它?
为什么至少没有一个高级用户可以更改以增加此限制的选项?

答案1

就我而言,我只有 Dropbox 和 TortoiseSVN。Dropbox 确实变得很烦人 - 每次更新后,我都需要运行我编写的脚本,从注册表中删除 Dropbox 的覆盖,然后重新启动 Windows 资源管理器。

从以下位置删除所有未使用的覆盖:

  • KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIcon‌​OverlayIdentifiers

  • KEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\explor‌​er\ShellIconOverlayIdentifiers

来源:为什么图标覆盖(来自第三方应用程序)没有显示在 Win8 资源管理器中?

增加到 25~35 会对性能造成巨大影响吗?

由于当前限制无法改变,因此我们无法预测如果增加限制会对性能产生什么样的影响。

为什么微软还没有意识到这是一个非常普遍的问题并尝试修复它?

我猜想它影响的人比你想象的要少。只有 Windows Shell 团队的某个人才能真正知道这个答案。在微软公布他们的决定之前,我们只能做出有根据的猜测,基本上就是没有人增加限制。

为什么至少没有一个高级用户可以更改的选项来增加这个限制?

只有 Windows Shell 团队的某个人才能真正知道这个答案。在微软公布他们的决定之前,我们只能做出有根据的猜测,基本上就是没有人编写代码来允许我们增加限制。

微软开发人员 Raymond Chen 对图标叠加有如下看法

一般而言,覆盖层并不是呈现信息的好方法,因为每个图标只能有一个覆盖层,并且每个 ImageList 最多只能有 15 个覆盖层。如果有两个或多个覆盖层适用于某个项目,那么其中一个将胜出而其他将失败,此时覆盖层作为确定哪些属性适用于某个项目的方式的价值就会降低,因为确定属性缺失的唯一方法是您根本看不到覆盖层。(如果您看到其他覆盖层,则无法判断是因为您的属性缺失还是因为显示的是其他覆盖层而不是您的属性。)

陈先生还表示:

另一个应用程序对性能抱有自私看法的例子是一家开发图标覆盖处理程序的公司。该 shell 将覆盖计算视为低优先级项目,因为让图标显示在屏幕上更为重要,这样用户就可以开始做他们想做的事情。装饰可以稍后再做。该公司想知道是否有办法提高其性能,并在图标出现之前将覆盖显示在屏幕上,这体现了对“性能”的极其自私的解释。

来源:这些小覆盖图标是什么:Windows 7 版本

答案2

我还想纠正一个误解。是的,总共分配了 15 个图标,但实际上11 个覆盖图标因为 Windows 系统为自己保留了 4 个,所以实际上,它有 11 个图标可供其他程序使用。(15-4=11)。这是根据微软官方支持网站存档网址

系统可支持的图标叠加处理程序数量受系统图像列表中图标叠加可用空间量的限制。目前为图标叠加分配了 15 个插槽,其中 4 个由系统保留。当系统中注册的图标覆盖处理程序多于 11 个时,只有图标覆盖处理程序提供的前 11 个图标覆盖会添加到系统图像列表中。其余的图标覆盖处理程序未被使用。

来源:微软官方支持网站存档网址

公共服务公告:

我还设计了一个 Wikipedia 页面,专门列出所有 shell 图标覆盖,以便用户可以识别哪些对 Dropbox、OneDrive、Tortoise 等最有用......

请查看我的 Wiki 页面并贡献:

https://en.wikipedia.org/wiki/List_of_shell_icon_overlay_identifiers

答案3

Raymond Chen 发表了一篇关于该主题的新博客文章:为什么外壳图标覆盖数量有 15 个限制? 其中有更详细的内容,但简短的版本是:原因是与旧版本和 API 的兼容性、性能问题以及现在不推荐使用图标覆盖的事实:

基本上可以归结为“这会很繁琐而且我们很懒惰。”

并且:

但这个没能实现的主要原因是覆盖不建议将其作为向用户传达文件元数据的方式

和:

Windows 10 通过将 OneDrive 文件同步状态指示器从图标覆盖移至单独的状态列,摆脱了图标覆盖的困扰。

相关内容