使Windows刷新图标缓存

Sud*_*n S 5 windows icons nsis windows-shell shell-icons

我真的很喜欢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
Run Code Online (Sandbox Code Playgroud)

$ 0寄存器用于存储Shell Icon SizeHKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics.然后我们递增值并执行a SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL),然后递减并重新发送.

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

And*_*ers 5

SystemParametersInfo()有一个名为SPI_SETICONS的参数,根据MSDN"重新加载系统图标".我从来没有尝试使用SPI_SETICONS所以我不知道它是否有效,如果你想测试你会使用像

System::Call 'user32::SystemParametersInfo(i 0x0058,i0,i0,i2)i' ;SPI_SETICONS
Run Code Online (Sandbox Code Playgroud)

如果事实证明这还不够,你可以拿出那个没有文件的大锤子:

  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)

请注意,这可能会重新排列桌面图标,即使"自动排列"已关闭,可能还有其他可能会惹恼用户的事情!


Ben*_*eno 5

您可以只运行以下命令行:

c:\Windows\System32\ie4uinit.exe -ClearIconCache
Run Code Online (Sandbox Code Playgroud)

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