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获取身份证号码验证码算法

android开发-px和dip以及sp的区别

Delphi memo加个prompttext

Delphi 全局变量 hinstance 到底是在什么时候赋值的?

Delphi使用zlib压缩和解压文件

Delphi 遍历某字段并插入到combobox

Delphi 获取系统串口列表

Delphi dbgrid中实现copy、paste功能

Delphi 多重循环

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



打赏

取消

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

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

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

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

评论

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