使Windows刷新图标缓存

时间:2010-07-14 04:01:12

标签: windows icons nsis windows-shell shell-icons

我真的很喜欢KDE SC 4的氧气外观。我写了一个程序将这些图标应用到windows。该程序是用NSIS编写的,目前几乎完全正常运行。但是,我发现让Windows了解图标更改的唯一方法是杀死explorer.exe,删除图标缓存,并重新生成explorer.exe。带有SHChangeNotify的{​​{1}}似乎无法让Windows了解控制面板图标,“我的电脑”图标等的更改。请建议更好,更简洁的方法让Windows了解这些更改

编辑:我发现了一个名为Icon Tweaker的程序似乎可以执行此操作,但它是封闭源代码,所以我不知道它是如何做到这一点的。 (IconTweaker:http://www.crystalxp.net/galerie/en.id.83-icontweaker.html

编辑:感谢Anders的回复(见下文),我的工作正常。但是,我将把我工作的NSIS代码放在这里,以防其他人需要它

SHCNE_ASSOCCHANGED

$ 0寄存器用于存储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 Shell Icon Size的值。然后我们递增值并执行HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics,然后递减并重新发送。

编辑:作为奖励,这可以用作在Windows XP上获得更大(Windows 7大小)桌面图标的黑客。只需将SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL)值加倍并调用Shell Icon Size(不执行恢复大小的第二个更改)

2 个答案:

答案 0 :(得分:5)

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)
  7. 请注意,这可能会重新排列桌面图标,即使“自动排列”已关闭,也可能是其他可能会惹恼用户的事情!

答案 1 :(得分:4)

您只需运行以下命令行:

c:\Windows\System32\ie4uinit.exe -ClearIconCache

该命令行将删除您的缓存图标,而无需重新启动资源管理器