Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使Windows刷新图标缓存_Windows_Icons_Nsis_Windows Shell_Shell Icons - Fatal编程技术网

使Windows刷新图标缓存

使Windows刷新图标缓存,windows,icons,nsis,windows-shell,shell-icons,Windows,Icons,Nsis,Windows Shell,Shell Icons,我真的很喜欢KDESC4的氧气外观。我编写了一个程序,将这些图标应用于windows。该程序是用NSIS编写的,目前几乎功能齐全。但是,我发现让Windows知道图标更改的唯一方法是杀死explorer.exe,删除图标缓存,并重新启用explorer.exeSHChangeNotifywithSHCNE\u ASSOCCHANGED似乎无法让Windows意识到控制面板图标、我的电脑图标等的更改。请建议一种更好、不太残酷的方法让Windows意识到这些更改 编辑:我发现一个名为Icon Twe

我真的很喜欢KDESC4的氧气外观。我编写了一个程序,将这些图标应用于windows。该程序是用NSIS编写的,目前几乎功能齐全。但是,我发现让Windows知道图标更改的唯一方法是杀死explorer.exe,删除图标缓存,并重新启用explorer.exe
SHChangeNotify
with
SHCNE\u ASSOCCHANGED
似乎无法让Windows意识到控制面板图标、我的电脑图标等的更改。请建议一种更好、不太残酷的方法让Windows意识到这些更改

编辑:我发现一个名为Icon Tweaker的程序似乎能够做到这一点,但它是封闭源代码,所以我不知道它是如何做到这一点的。(图标:)

编辑:感谢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\u CURRENT\u USER\Control Panel\Desktop\WindowMetrics
Shell图标大小值。然后,我们增加该值并执行发送消息超时(HWND_广播、WM_设置更改、SPI_设置非客户端度量、0、SMTO_中止、100000、NULL)
,然后递减并重新发送

编辑:作为奖励,这可以作为在Windows XP上获得更大(Windows 7大小)桌面图标的黑客手段。只需将
外壳图标大小
值加倍,然后调用
发送消息
(不要执行恢复大小的第二次更改)

()有一个名为SPI_SETICONS的参数,该参数根据MSDN“重新加载系统图标”。我从来没有尝试过使用SPI_设置图标,所以我不知道它是否有效,如果你想测试,你会使用类似的东西

System::Call 'user32::SystemParametersInfo(i 0x0058,i0,i0,i2)i' ;SPI_SETICONS
如果结果证明这还不够,你可以拿出一把大的无证锤子:

  • 读取HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics中名为“Shell Icon Size”的REG_SZ值(如果该值不存在,请中止或使用GetSystemMetrics(SM_CXICON))
  • 从第一步得到的数字中减去1
  • 将修改后的条目写回注册表
  • 调用SendMessageTimeout(HWND_广播、WM_设置更改、SPI_设置非客户端度量、0、SMTO_中止、100000、空)
  • 将第一步输入的号码写回注册表
  • 调用SendMessageTimeout(HWND_广播、WM_设置更改、SPI_设置非客户端度量、0、SMTO_中止、100000、空)

  • 请注意,这可能会重新排列桌面图标,即使“自动排列”处于关闭状态,也可能会出现其他可能会困扰用户的问题

    只需运行以下命令行即可:

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

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

    @Sudarshan S:ReadRegStr、IntOp、WriteRegStr、SendMessage 0xffff 0x001A 42 0/TIMEOUT=100000都是内置命令,System::Call'user32::GetSystemMetrics(i 11)i.r0'将为您提供SM_CXICON大小,单位为$0I在C#程序中有类似的问题。你把它弄好了吗?是的。我上面发布的代码(NSIS代码)起到了作用。不确定这是什么作用,但它没有清除图标缓存。