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

时间:2016-01-14 20:30:46

标签: winapi

任务

我正在尝试从我的应用程序中自定义文件夹图标,但由于Windows缓存图标和缩略图的方式,我正在努力让更改的文件夹更新它的新图标。

在Windows中我有两种方法可以自定义文件夹图标,最简单的方法是从Windows资源管理器中右键单击该文件夹,然后选择“自定义”选项卡并更改其图标,这种方法虽然不好因为它需要手动更改文件夹属性。

我从我的程序中做的第二种方法是创建一个desktop.ini文件并将其放在需要更改图标的文件夹中,desktop.ini上的文档可以在这里找到:{{3这里有一篇文章:http://hwiegman.home.xs4all.nl/desktopini.html

如下所示,虽然您可以从文件夹属性中看到图标已更改,但Windows中的文件夹图标未更新,但只是Windows未显示更新的文件夹图标:

http://helpdeskgeek.com/how-to/customize-folder-icons-desktop-ini/

我完全了解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"资源管理器选项:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced存储在IconsOnly
  • 更改图标大小,从注册表中返回,位于此处:HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics存储在Shell Icon Size
  • 此链接在Delphi中提供了一个明显的解决方案,我无法在Lazarus中进行转换:enter image description here
  • 我在这里知道缓存的db文件:AppData\Local\Microsoft\Windows\Explorer虽然我不确定它们是否有任何帮助但是试图删除其中一些似乎不可能,因为它们可能被锁定等。
  • 重命名文件夹,然后重命名回原始名称。
  • 右键单击Windows资源管理器中的空白区域,然后选择“刷新”似乎也不会更新文件夹图标。

还尝试过执行上述某些操作,但没有运气。

问题

直接从Windows资源管理器更改文件夹图标时,使用属性上下文菜单和自定义选项卡,在应用和关闭此对话框时,文件夹图标几乎立即更改,没有关闭explorer.exe或重新启动Windows,更改发生非常马上。

如何以编程方式从我的应用程序以与Windows资源管理器相同的方式实现此目的?有没有办法找出Windows资源管理器如何做到这一点?

我的操作系统是Windows 10,它可以解释为什么有些旧方法对我不起作用。

1 个答案:

答案 0 :(得分:3)

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

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