Delphi 清除Windows 图标缓存源代码


本文整理自网络,侵删。

 
procedure RebuildIconCache;

....
const
  sr_WindowMetrics='Control Panel\Desktop\WindowMetrics\';
  sr_ShellIconSize='Shell Icon Size';

function  WindowsDir:string;
var
 buffer: array [0..255] of char;
begin
 GetWindowsDirectory(@Buffer,SizeOf(buffer));
 Result:=Buffer;
end;

Function UpdateAllWindowsCallback(WHandle : HWnd;
  Var Parm : Pointer) :
  Boolean; stdcall;
begin
 SendMessage(WHandle,WM_SETTINGCHANGE,0,0);
 Result:=True;
end;

Procedure UpdateAllWindows;
Begin
  EnumWindows(@UpdateAllWindowsCallback,
  WM_SETTINGCHANGE);
End;


function GetIconCacheFile:string;
begin
 Result:=getwindowspath+'ShellIconCache';
end;

procedure DeleteIconCache;
var
 sfile:string;
begin
 sfile:=GetIconCacheFile;
 if fileexists(sfile) then begin
  if deletefile(sfile)=false 
  then showmessage('Can not erase file: '+sfile);
 end;
 QueryRestartWindows;
end;


function RefreshActiveDesktop:boolean;
const
  CLSID_ActiveDesktop: TGUID 
  = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
  ActiveDesktop: IActiveDesktop;
begin
 try
  ActiveDesktop := CreateComObject(CLSID_ActiveDesktop)
    as IActiveDesktop;
  ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
  Result:=true;
 except
  Result:=false;
 end;
end;

procedure RefreshDesktop;
var
 wnd:THandle;
 fl:boolean;
begin
 fl:=RefreshActiveDesktop;
 if fl=false then begin
  wnd:=FindWindow('Progman', 'Program Manager');
  if wnd<>0 then SendMessage(wnd,WM_COMMAND,$A065,0)
  else UpdateAllWindows;
 end;
end;

procedure RebuildIconCache;
var
 news,olds:string;
 sz:integer;
begin
 Startwait;
 try
  deletefile(GetIconCacheFile);
  olds:=regreadstring(HKEY_CURRENT_USER,
    sr_WindowMetrics+sr_ShellIconSize);
  sz:=strtointdef(olds,32);
  inc(sz);
  news:=inttostr(sz);
  regwritestring(HKEY_CURRENT_USER,
    sr_WindowMetrics+sr_ShellIconSize,news);
  UpdateAllWindows;
  if olds='' then olds:='32';
  regwritestring(HKEY_CURRENT_USER,
    sr_WindowMetrics+sr_ShellIconSize,olds);
  UpdateAllWindows;
  RefreshDeskTop;
 finally
  StopWait;
 end;
end;

相关阅读 >>

Delphi异常处理的基本原则和方法

Delphi idhashmessagedigest, idhash, idglobal md5

Delphi 如何将整数值转换为罗马数字表示形式

winapi 字符及字符串函数(8): ischarupper - 是否是个大写字母

Delphi 如何在webservice中获取客户端的ip地址

Delphi 改变位图图片大小

Delphi多线程

Delphi 快速读取txt 指定行的数据

Delphi 部分操作文件函数

Delphi读取xml文件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...