图标缓存可能会被某些软件破坏,会导致图标不显示或者显示不正常,如:
看着是不是很痛苦?我从网上找了些代码,写了一个具有刷新图标和重建图标缓存功能的小工具,若遇到图标显示不正常的现象,点一下,就恢复正常了。啥?你没遇到过?呵呵,没准明天你就遇上了。
点击这里下载此文件:重建图标缓存小工具
下面是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 Response to “重建图标缓存——Delphi小工具(附源码)”
By hymagic on 2008-8-20 19:29:14| http://www.magicteach.cn
你太有才了~和和和