任务
我正在尝试从我的应用程序中自定义文件夹图标,但由于Windows缓存图标和缩略图的方式,我无法让更改后的文件夹更新其新图标。
在Windows中,我知道有两种方法可以自定义文件夹图标,最简单的方法是从Windows资源管理器中右键单击文件夹,选择“属性”,然后选择“自定义”选项卡并更改其图标,但该方法不可行,因为它需要手动更改文件夹属性。
我从程序中采用的第二种方法是创建一个 desktop.ini
文件,并将其放置在需要更改图标的文件夹中,desktop.ini
的文档可以在这里找到: http://hwiegman.home.xs4all.nl/desktopini.html 以及这篇文章: http://helpdeskgeek.com/how-to/customize-folder-icons-desktop-ini/
如下所示,虽然您可以从文件夹属性中看到图标已更改,但Windows中的文件夹图标未更新,仅此而已:
我完全知道Windows缓存图标和缩略图,我已经搜索并阅读了几页有关如何重建图标缓存的方法,以便让Windows显示新更改的图标而不是缓存的图标,但是我无法从我的应用程序中使其工作,而不需要重新启动Windows或Explorer.exe进程,这必须在不中断Windows的情况下完成,因此关闭Explorer.exe或要求重新启动绝对不是一个选项。
有趣的是,当从我之前描述的第一种方式更改文件夹图标时,Windows以某种方式刷新并重建图标缓存,因为更改后的文件夹会立即更新以显示新图标,但我无法看到Windows使用了什么技巧来实现这一点。
尝试
我尝试了以下几个未成功的方法(没有特定顺序):
- 执行以下命令:
ie4uinit.exe -ClearIconCache
- 在Lazarus中运行以下代码:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
- 从
AppData\Local
中删除IconCache.db
文件 - 从注册表中切换“始终显示图标,从不显示缩略图”选项,位于此处:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced
,存储在IconsOnly
值中 - 从注册表更改图标大小并还原,位于此处:
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
,存储在Shell Icon Size
值中 - 此链接提供了Delphi的明显解决方案,但我无法在Lazarus中转换:http://www.aha-soft.com/faq/q18.htm
- 我知道这里有缓存的db文件:
AppData\Local\Microsoft\Windows\Explorer
,尽管我不确定它们是否有任何帮助,但试图删除其中一些似乎不可能,因为它们可能会被锁定等。 - 将文件夹重命名,然后重新命名为原始名称。
- 右键单击Windows资源管理器中的空白处,选择“刷新”似乎也无法更新文件夹图标。
我已经尝试了一些组合,但没有成功。
问题
当直接从Windows资源管理器更改文件夹图标时,使用属性上下文菜单和自定义选项卡,应用并关闭此对话框后,文件夹图标几乎立即更改,没有关闭explorer.exe或重启Windows,变化非常快。
如何以编程方式从我的应用程序实现与Windows资源管理器相同的操作?有办法找出Windows资源管理器是如何做到的吗?
我的操作系统是Windows 10,这可能解释了为什么一些较旧的方法对我无效。