【问题标题】:How to rebuild Windows Icon Cache without closing explorer.exe or restarting Windows?如何在不关闭 explorer.exe 或重新启动 Windows 的情况下重建 Windows 图标缓存?
【发布时间】: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


【解决方案1】:

我认为这与图标缓存无关;您只需要通知资源管理器文件夹的图标已更改。您可以使用SHChangeNotify 函数执行此操作。

LPCWSTR pszFolder = L"c:\\path\\to\\folder";
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, pszFolder, NULL);

【讨论】:

  • 由于某种原因,我无法让 SHChangeNotify 函数工作。该文件夹似乎刷新了,因为当我从我的应用程序创建并将 desktop.ini 文件添加到它的任何子文件夹然后调用 SHChangeNotify 函数时,我可以明显看到文件夹按字母顺序重新组织,所以显然它已经做了一些事情,除了更新文件夹图标。例如,有没有办法从 cmd.exe 执行这个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多