刷新Windows图标缓存

6
我非常喜欢KDE SC 4的外观。我写了一个程序将这些图标应用到Windows上。该程序是用NSIS编写的,目前几乎完全功能正常。然而,我发现让Windows意识到图标更改的唯一方法是杀死explorer.exe,删除图标缓存并重新启动explorer.exe。SHChangeNotifySHCNE_ASSOCCHANGED似乎无法让Windows意识到控制面板图标、我的电脑图标等的更改。请建议更好的、不那么粗暴的方法来让Windows意识到这些更改。
编辑:我找到了一个名为Icon Tweaker的程序,它似乎能够做到这一点,但它是闭源的,所以我不知道它是如何做到的。(IconTweaker:http://www.crystalxp.net/galerie/en.id.83-icontweaker.html
编辑:多亏了Anders的回复(见下文),我已经将其成功运行。然而,我将在此放置我的工作NSIS代码,以防其他人需要它。
ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size"
IntOp $0 $0 + 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
IntOp $0 $0 - 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
$0寄存器用于存储HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics的Shell Icon Size值。然后,我们会将该值递增,并执行SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL),接着进行递减并重新发送。
编辑:作为奖励,这可以用作在Windows XP上获取更大(Windows 7大小)桌面图标的技巧。只需将Shell Icon Size值加倍并调用SendMessage即可(不要执行第二次更改以恢复大小)。

我在一个C#程序中遇到了类似的问题。你解决了吗? - user328146
是的。我上面发布的代码(NSIS代码)解决了问题。 - Sudarshan S
3个回答

8
您可以直接运行以下命令行:
c:\Windows\System32\ie4uinit.exe -ClearIconCache

那个命令行可以删除你的缓存图标,无需重新启动资源管理器。

不确定这是什么,但它不会清除图标缓存。 - user3690202

6

SystemParametersInfo()函数有一个名为SPI_SETICONS的参数,根据MSDN文档,“重新加载系统图标”。我从未尝试使用SPI_SETICONS,因此不知道它是否有效。如果您想进行测试,可以使用类似以下的内容:

System::Call 'user32::SystemParametersInfo(i 0x0058,i0,i0,i2)i' ;SPI_SETICONS

如果这不够用,你可以使用未记录的大锤子:
  1. 在HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics中读取名为“Shell Icon Size”的REG_SZ值(如果值不存在,则中止或使用GetSystemMetrics(SM_CXICON))
  2. 从第一步得到的数字中减去1
  3. 将修改后的条目写回注册表
  4. 调用SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,0,SMTO_ABORTIFHUNG,100000,NULL)
  5. 将从第一步获得的数字重新写入注册表
  6. 调用SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,0,SMTO_ABORTIFHUNG,100000,NULL)
请注意,即使“自动排列”关闭,这可能会重新排列桌面图标,并可能引起其他可能会使用户感到烦恼的事情!

1
@Sudarshan S:ReadRegStr、IntOp、WriteRegStr、SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000 都是内置命令,System::Call 'user32::GetSystemMetrics(i 11)i.r0' 将会返回 $0 中的 SM_CXICON 大小。 - Anders

0

刷新图标的简单方法是使用Windows磁盘清理。我建议大多数用户从这种方法开始 - 对于初学者来说,它快速、简单且不可怕。

  • 点击“开始”菜单并键入磁盘清理
  • 选择要清理的驱动器(很可能是默认的C:驱动器)
  • 在“要删除的文件”列表中选中缩略图
  • 点击确定

一旦Windows完成删除缓存的缩略图,当您重新访问文件夹时,它将重新构建它们。这个过程很快,对您的系统没有任何伤害。

希望这可以帮助到您!


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