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

7

任务

我正在尝试从我的应用程序中自定义文件夹图标,但由于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中的文件夹图标未更新,仅此而已:

enter image description here

我完全知道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,这可能解释了为什么一些较旧的方法对我无效。

1个回答

5

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

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

出于某种原因,我无法使SHChangeNotify函数正常工作。该文件夹似乎已经刷新,因为当我从我的应用程序创建并添加desktop.ini文件到任何子文件夹中,然后调用SHChangeNotify函数时,我可以明显地看到文件夹按字母顺序重新组织的方式,所以显然它做了一些事情,除了更新文件夹图标之外。也许有一种方法可以通过cmd.exe执行此操作? - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接