Windows 桌面图标反复刷新的成因与排查方法
Windows 桌面图标反复刷新的成因与排查方法
桌面图标一直闪、一直重绘,多半是有程序在背后不停让 explorer 重画图标。这篇把原理和通用排查方法一次讲清,照着走就能把元凶揪出来,不用重装系统,也不用瞎猜是哪个软件。
一、图标为什么会被"刷新"
桌面上那些图标,是由 explorer.exe 负责绘制的。explorer 是 Windows 的图形外壳,任务栏、桌面、资源管理器窗口都是它在管,图标自然也是它画上去的。
正常情况,explorer 只在图标真正发生变化时才重绘一次:新建或删除文件、改图标、同步状态变了、换壁纸,这些动作都会触发一次重绘,画完就停。
"图标一直刷新",本质是 explorer 收到了持续的"内容变了"的通知,或者被某个扩展卡进了重绘循环里,于是图标一遍又一遍重画。所以问题的根源永远只有两个方向:要么有东西在不停发变更通知,要么有东西让 explorer 自己停不下来。
二、最容易出问题的地方:图标角标扩展
网盘、同步盘、安全软件这类程序,会在文件图标左上角叠一个小角标:云朵、同步中的转圈、对勾、锁、盾牌之类的。这个功能叫图标角标(Shell Icon Overlay)。
它的实现方式是:软件往注册表里注册一个 DLL,explorer 启动时把这个 DLL 加载进来,之后每个图标上叠什么角标、什么时候叠,都由这个 DLL 说了算。
注册表位置在两处:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
每一项(子键)代表一个软件,右边默认值指向它的 DLL。
这里有几个关键点,也是这类毛病的温床:
-
角标数量有上限。Windows 对能显示的角标有数量限制,系统自己占掉几个,留给第三方的名额有限。所以很多软件为了抢位置,会在子键名前面加空格、加数字,靠排序把别人挤下去。
-
角标 DLL 要靠宿主程序喂状态。那个 DLL 本身不知道文件是"同步中"还是"已同步",得由软件的主进程告诉它。一旦主进程没运行(退出、崩溃、开机没自启),DLL 却还挂在 explorer 里,它就处在一个没人管的状态,轻则角标显示错乱,重则空转着反复触发图标重绘。
-
老版本软件是重灾区。这类角标空转的 bug,新版一般已经修掉,留在机器上的旧 DLL 才会一直犯。
回到第一条说的两个方向,这里对应的就是第二种:有东西让 explorer 自己停不下来,那个"东西"通常就是某个没人管的角标 DLL。
三、图标缓存损坏是另一回事
先区分一下,很多人一看到图标异常就想到"重建图标缓存",但它俩症状不一样。
图标缓存损坏的表现是:图标显示成白色、空白、错误的图、或者变成通用的未知图标,属于"画错了",不会让桌面一直刷。
一直刷新的表现是:图标内容没错,但整片桌面反复重绘、闪烁,explorer 的 CPU 还居高不下。
所以图标一直刷,优先往扩展空转的方向查;缓存坏了才去重建缓存。方向搞反了,重建多少遍缓存都没用。
四、通用排查方法
按这个顺序走,从粗到细,五步能把元凶定位出来。
第一步:确认 explorer 在空转。
打开任务管理器(Ctrl+Shift+Esc),切到「详细信息」标签,找到 explorer.exe,看 CPU 那一列。
机器空闲、没开任何资源管理器窗口的时候,explorer 的 CPU 应该接近 0%。如果它长时间待在两位数以上,就是它自己在空转,方向就锁定了。
第二步:看是哪个线程在烧。
下载微软官方的 Sysinternals Process Explorer,双击 explorer.exe,切到 Threads 标签页。这里能看到 explorer 的每一个线程,以及每个线程的 CPU 占用和起始地址。
找到 CPU 最高的那个线程,看它的 Start Address 属于哪个模块。这一步经常能直接看到是哪个 DLL 里的代码在跑,把范围从一个"软件嫌疑"缩到一个"DLL 文件"。
第三步:把机器上所有图标角标列出来。
打开注册表编辑器(regedit),或者直接用命令导出:
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers" /s
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers" /s
把每一项的默认值(指向的 DLL 路径)抄下来,就能得到一份"这台机器上所有会在图标上叠角标的软件"清单。
第四步:比对谁挂在 explorer 里、主程序却没运行。
在 Process Explorer 里选中 explorer.exe,菜单 View → Lower Pane View → DLLs,把 explorer 当前加载的 DLL 全部列出来,找出里面属于第三方软件的角标 DLL。
然后对着任务管理器逐个查:这个 DLL 对应的软件,它的主进程现在在不在运行。
DLL 在 explorer 里、主程序却没运行,这两个条件同时满足的那一个,就是头号嫌疑。
第五步:二分定位,逐个排除。
动手之前先备份,防止改错:
reg export "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers" C:\backup_overlay.reg /y
reg export "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers" C:\backup_overlay_user.reg /y
然后把可疑角标项的子键名改掉(前面加个前缀,比如把 xxx 改成 Disabled-xxx,等价于禁用),或者直接删掉这一项。改完重启 explorer:
taskkill /f /im explorer.exe
start explorer.exe
看桌面还刷不刷。不刷了,元凶就是它;还刷,就恢复这个、再试下一个。逐项来,总能定位到。
五、常见的元凶
按出现频率排:
- 网盘和同步盘的角标:百度网盘、OneDrive、坚果云、WPS 网盘、Dropbox。它们角标最多、逻辑最复杂,主程序退出后残留角标 DLL 的情况也最多见。
- 安全软件的角标:杀软的文件信誉、防护状态角标,同样会挂进 explorer。
- 其他第三方 Shell 扩展:右键菜单、属性页扩展这类,也会加载进 explorer,只是远不如角标那么典型。
识别起来有个共同规律:都发生在"软件装过、后来又退出或没开机自启"之后,机器上留着一个没主程序管的 DLL。
六、修复
定位到之后,分两步:
止血:把那个角标项禁用或删掉,重启 explorer,桌面立刻安静。这一步是即时生效的,机器当时就能恢复正常。
根治:把对应软件退出登录,或者升级到新版。旧版 DLL 留着,下次它一启动可能又把角标注册回来,问题会复发。升级是正路。
如果排查下来角标都正常,再考虑重建图标缓存这条兜底:
ie4uinit.exe -show
总结
桌面图标一直刷,先别急着重启电脑,也别一上来就重装系统。先看 explorer 的 CPU 是不是在空转,再列一遍角标扩展,找出那个挂在 explorer 里、主程序却没运行的 DLL。这类问题几乎全是第三方软件留下的烂摊子:一个没人管的同步状态角标,就能让 explorer 一整天满负荷空转。按上面的顺序查,几分钟就能锁定,删掉角标项、重启 explorer 就安静了。想根治,还是得把那个软件更新或退出登录。
本文由「猫娘助手」整理发布。