Batch file 以编程方式更改和刷新图标(无需重新启动)
当我手动更换图标时(即不是从资源管理器中的“文件夹选项”窗口),图标不会被更新。例如,如果我执行此批处理代码:Batch file 以编程方式更改和刷新图标(无需重新启动),batch-file,vbscript,windows-xp,Batch File,Vbscript,Windows Xp,当我手动更换图标时(即不是从资源管理器中的“文件夹选项”窗口),图标不会被更新。例如,如果我执行此批处理代码: REG ADD HKCR\testfile\DefaultIcon /ve /d "C:\test.ico,0" /f 图标显示在文件夹选项列表中,但图标不会在桌面或资源管理器中更新 如果我只需点击任何文件类型的“更改图标”按钮并退出文件夹选项窗口,图标就会更新。但据我所知,这不能通过批处理或VBS完成 重新启动explorer.exe确实有效,但如果我这样做,任务栏中的应用程序选项
REG ADD HKCR\testfile\DefaultIcon /ve /d "C:\test.ico,0" /f
图标显示在文件夹选项列表中,但图标不会在桌面或资源管理器中更新
如果我只需点击任何文件类型的“更改图标”按钮并退出文件夹选项窗口,图标就会更新。但据我所知,这不能通过批处理或VBS完成
重新启动explorer.exe确实有效,但如果我这样做,任务栏中的应用程序选项卡会因某种原因出现问题(例如:当应用程序最大化时,我不能再左键单击任务栏中的选项卡以最小化它-我必须右键单击它并单击最小化…)。更不用说,如果我这样做,所有打开的资源管理器窗口都会关闭,这有点麻烦
我还有一个TuneUp Utilities的副本,它有一个用于重新加载图标缓存的选项,它的工作方式与预期的一样。但再一次,我无法通过批处理或VBS访问此工具。而且它不会重新启动explorer.exe或删除任何文件(就像某些解决方案那样)。我对此持肯定态度,因为我的操作系统驱动器上没有iconcache.db文件
我还尝试通过VBS添加注册表项,但没有帮助
欢迎任何批处理或VBScript解决方案 有一个重建缓存的VB程序(查看frmRebuiltIconCache.frm了解实际代码)
它所做的是检查HKCU\Control Panel\Desktop\WindowMetrics\Shell图标大小的值
,从中减去1,通过SendMessageTimeout
强制超时,然后重置该值,并重复超时
由于无法从vbs调用DLL(没有外部程序),这可能无法满足您的需要。我已将该计划缩减为:
'SendMessageTimeout values
Const HWND_BROADCAST = &HFFFF
Const WM_SETTINGCHANGE = &H1A
Const SPI_SETNONCLIENTMETRICS = &H2A
Const SMTO_ABORTIFHUNG = &H2
'Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
' (ByVal hwnd As Long, ByVal msg As Long, _
' ByVal wParam As Long, ByVal lParam As Long, _
' ByVal fuFlags As Long, ByVal uTimeout As Long, _
' lpdwResult As Long) As Long
Dim icon_size
Dim new_icon_size
Dim result
Dim SysVarReg
Set SysVarReg = WScript.CreateObject("WScript.Shell")
' Get the current icon size.
icon_size = SysVarReg.RegRead ("HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size")
' Increase the value by 1.
new_icon_size = CInt(icon_size) + 1
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", new_icon_size
' Send HWND_BROADCAST to refresh the icons.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result
' Restore the original value.
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", icon_size
' Send HWND_BROADCAST to refresh the icons again.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result
但是如果没有包装DLL调用的东西,您将无法通过vbs通过关联文件来完成此操作,系统将刷新图标,因此我的简单解决方案就是:
ASSOC .anyextension=anytype
ASSOC .anyextension=
第二行解除扩展的关联。这不是VBScript解决方案。也没有办法将其移植到VBS,是吗?我之所以需要批处理或VBS,是因为这应该在重新安装操作系统后直接执行。所以我不应该先安装其他程序。谢谢你!我在尝试时遇到了这个错误:语法错误,第1行,字符9,代码800A03EA。我不知道它在其他Windows系统上是否有任何不同,但它至少在XP中对我不起作用…你能添加一些额外的信息,以及你的答案吗?太草率了<代码>变光结果?错误:附加信息:调用PInvoke函数“WHoSeBox!”!WHoSeBox.MainBoot::SendMessageTimeout'使堆栈不平衡。
' It work in XP.
' The following is "VBA" Module.
' ---------------------------------------------------------
'SendMessageTimeout values
Const HWND_BROADCAST = &HFFFF
Const WM_SETTINGCHANGE = &H1A
Const SPI_SETNONCLIENTMETRICS = &H2A
Const SMTO_ABORTIFHUNG = &H2
Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
(ByVal hwnd As Long, ByVal msg As Long, _
ByVal wParam As Long, ByVal lParam As Long, _
ByVal fuFlags As Long, ByVal uTimeout As Long, _
lpdwResult As Long) As Long
Sub Rebuild_Icon_cache()
Dim icon_size
Dim new_icon_size
Dim result
Dim SysVarReg
Set SysVarReg = CreateObject("WScript.Shell")
' Get the current icon size.
icon_size = SysVarReg.RegRead("HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size")
' Increase the value by 1.
new_icon_size = CInt(icon_size) + 1
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", new_icon_size
' Send HWND_BROADCAST to refresh the icons.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result
' Restore the original value.
SysVarReg.RegWrite "HKCU\Control Panel\Desktop\WindowMetrics\Shell Icon Size", icon_size
' Send HWND_BROADCAST to refresh the icons again.
SendMessageTimeout HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 10000, result
End Sub