如何在不关闭 explorer.exe 或重新启动 Windows 的情况下重建 Windows 图标缓存?

Cra*_*aig 5 winapi

任务

我正在尝试从我的应用程序中自定义文件夹图标,但由于 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);
  • IconCache.db从删除文件AppData\Local
  • "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,这可以解释为什么某些旧方法对我不起作用。

Jon*_*ter 5

我不认为这与图标缓存有任何关系;您只需通知资源管理器该文件夹的图标已更改。您可以使用该SHChangeNotify函数来完成此操作。

LPCWSTR pszFolder = L"c:\\path\\to\\folder";
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, pszFolder, NULL);
Run Code Online (Sandbox Code Playgroud)