解决方案已经发布在Github点击下载

问题分析

在卸载Steam重新安装后,所有之前安装的游戏Steam桌面图标变白。

这是由于卸载Steam后C:\Program Files (x86)\Steam\steam\games内缓存的文件图标丢失导致的

以文本方式打开桌面图标,以CS2为例:

[InternetShortcut]
IDList=
IconIndex=0
URL=steam://rungameid/730
IconFile=C:\Program Files (x86)\Steam\steam\games\324b323045b09bace182f928f4104dfcd93cb7f3.ico

发现IconFile指向的文件不存在。

问题解决

通过Steamdb发现Clienticon的URL为以下格式

Steamdb上游戏clienticon的信息
Clienticon的URL分为APPID和图标文件名几部分

图标文件名可以通过解析快捷方式的文件获得,appid可以通过截取快捷方式中URL的后半部分获得。通过枚举桌面文件的扩展名判断是否是快捷方式,通过读取URL是否以Steam开头可以判断是否是Steam游戏。

运行结果

最后,通过以下代码刷新图标缓存

system("taskkill /f /im explorer.exe");
system(R"(attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db")");
system(R"(del /f "%userprofile%\AppData\Local\IconCache.db")");
system(R"(attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db")");
system(R"(del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db")");
system("echo y reg delete \"HKEY_CLASSES_ROOT\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\TrayNotify\" /v IconStreams");
system("echo y reg delete \"HKEY_CLASSES_ROOT\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\TrayNotify\" /v PastIconsStream");
system("start explorer");

最后说下踩的坑

1.curl用minGW直接编译出不来lib文件,需要用nmake编译

2.下载文件FILE要用wb方式二进制打开

参考

https://www.bilibili.com/read/cv26845826/


D3bug the w0r1d