【发布时间】:2016-01-14 20:30:46
【问题描述】:
任务
我正在尝试从我的应用程序中自定义文件夹图标,但由于 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 显示新更改的图标而不是缓存的图标,但是我无法在不重新启动 Windows 或 Explorer.exe 进程的情况下从我的应用程序中运行它,这需要在不中断 Windows 的情况下完成,因此关闭 Explorer.exe 或需要重新启动绝对不是一种选择。
有趣的是,当从我之前描述的第一种方式更改文件夹图标时,Windows 以某种方式设法刷新并重建图标缓存,因为更改的文件夹会及时更新以显示新图标,但是我看不出 Windows 有什么技巧实现这一目标。
尝试
我尝试了一些不成功的事情,(不分先后):
- 执行以下命令:
ie4uinit.exe -ClearIconCache - 在 Lazarus 中运行此代码:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); - 从
AppData\Local中删除IconCache.db文件 - 从注册表切换
"Always show icons, never thumbnails"Explorer 选项,位于此处: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,这可以解释为什么某些旧方法不适合我。
【问题讨论】:
标签: winapi