Written on 2008年8月19日 @ 23:27 | by spirit | Tags: delphi  源码   | 浏览:

图标缓存可能会被某些软件破坏,会导致图标不显示或者显示不正常,如:

图标缓存被破坏

看着是不是很痛苦?我从网上找了些代码,写了一个具有刷新图标和重建图标缓存功能的小工具,若遇到图标显示不正常的现象,点一下,就恢复正常了。啥?你没遇到过?呵呵,没准明天你就遇上了。

点击这里下载此文件:重建图标缓存小工具

下面是Delphi的源码:

unit rebuild;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Registry, StdCtrls, abcbtn, abcnpbtn,ShlObj, WinSkinData,shellapi;

type
  Tmainform = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SkinData1: TSkinData;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Label2MouseLeave(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  mainform: Tmainform;


implementation

{$R *.dfm}

function RefreshScreenIcons : Boolean;
const
KEY_TYPE = HKEY_CURRENT_USER;
KEY_NAME = 'Control Panel\Desktop\WindowMetrics';
KEY_VALUE = 'Shell Icon Size';
var
Reg: TRegistry;
strDataRet, strDataRet2: string;

procedure BroadcastChanges;
var
success: DWORD;

begin
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,
SPI_SETNONCLIENTMETRICS,0,SMTO_ABORTIFHUNG,10000,success);
end;


begin
Result:= False;
Reg := TRegistry.Create;
try
Reg.RootKey := KEY_TYPE;
// 1. open HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
if Reg.OpenKey(KEY_NAME, False) then
begin
// 2. Get the value for that key
strDataRet:= Reg.ReadString(KEY_VALUE);
Reg.CloseKey;
if strDataRet <> '' then
begin
// 3. Convert sDataRet to a number and subtract 1,
// convert back to a string, and write it to the registry
strDataRet2 := IntToStr(StrToInt(strDataRet) - 1);
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet2);
Reg.CloseKey;
{ 4. because the registry was changed, broadcast
 the fact passing SPI_SETNONCLIENTMETRICS,
 with a timeout of 10000 milliseconds (10 seconds)
}
BroadcastChanges;
{ 5. the desktop will have refreshed with the
 new (shrunken) icon size. Now restore things
 back to the correct settings by again writing
 to the registry and posing another message.
}
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet);
Reg.CloseKey;
// 6. broadcast the change again
BroadcastChanges;
Result := True;
end;
end;
end;
end;
finally
Reg.Free;
end;
end;


procedure Tmainform.Button1Click(Sender: TObject);
begin
 RefreshScreenIcons;
end;

procedure Tmainform.Button2Click(Sender: TObject);
begin
    SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,nil,nil);
end;

procedure Tmainform.Label2Click(Sender: TObject);
begin
   ShellExecute(handle,'open',
'http://www.7788sky.cn', nil,nil,SW_SHOWNORMAL);
end;

procedure Tmainform.Label2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Label2.Font.Color:=clRed;
  Label2.Cursor:=crHandPoint;
end;

procedure Tmainform.Label2MouseLeave(Sender: TObject);
begin
  Label2.Font.Color:=clBlack;
end;

end.


若转载请注明出处: Spirit's Home
本文地址: http://www.7788sky.cn/post/delphi-rebuilt-Screenicons.html
  1. 1 Response to “重建图标缓存——Delphi小工具(附源码)”

  2. By hymagic on 2008-8-20 19:29:14| http://www.magicteach.cn

    你太有才了~和和和

Post a Comment

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。