全部在这儿了:
我自己摸索和一位网友的答案。
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST+SHCNF_FLUSH,nil,nil);//刷新文件关联图标
其中SHChangeNotify还有多个地方可以刷新(如文件删除,磁盘弹出等等),具体的看帮助!
SHChangeNotify(SHCNE_ALLEVENTS , SHCNF_FLUSH,nil,nil);//发生所有的事件,系统应该刷新响应的项目
function SHUpdateRecycleBinIcon():boolean;stdcall;external 'shell32.dll' name 'SHUpdateRecycleBinIcon';//刷新回收站图标
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);//通知系统设置改变
var
buf
char;
...
getmem(buf,SizeOfBuf);//
strpcopy(buf,'注册表的主键,例如Software/Microsoft/windows/currentversion/Explorer/ToolBar');
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,buf);
//通知系统刷新响应的键值,如果前面的没有起作用,那么可以采用这个方法。
systemparametersinfo(SPI_SETDESKWALLPAPER,0,pchar(path),0);
//上面的是通知系统更改了墙纸,其中path为墙纸的路径。
同样,SystemParametersInfo()还可以对系统进行很多方面的刷新,例如更改了桌面的大小等等,你可以看看帮助,我不可能在这儿把所有的都写出来。
要做到象Tweak UI那样Rebuild ICON,可以采用下面的方法:
:delphifan
这个问题确实很有意思,害得我找了很久,请看答案:
Reg := TRegistry.Create;
try
//设置图标
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('/Software/Microsoft/Windows/CurrentVersion/explorer/Shell Icons',True) then
Reg.WriteString('3','C:/WINDOWS/SYSTEM/shell32.dll,15');
//修改icon size
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Control Panel/Desktop/WindowMetrics', True)
then Reg.WriteString('Shell Icon Size','31');
//通知windows
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
//当然别忘了改回来
Reg.WriteString('Shell Icon Size','32');
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
finally
Reg.CloseKey;
Reg.Free;
end;
关键是强迫windows重新刷新 icon cache,通过修改icon大小是一种可行的办法,