怎样根据文件的扩展名,找到系统中该类型文件默认的显示图标
如上比如 test.jpg文件,我想得到其在资源管理器中显示的图标.
应该怎样做.
因为我自己用了一个listview,里面有虚拟的文件列表(文件在硬盘中不存在),想根据文件扩展名在listview中显示出他在本机系统中的默认图标.
高分请教.可以再加分.
如上比如 test.jpg文件,我想得到其在资源管理器中显示的图标.
应该怎样做.
因为我自己用了一个listview,里面有虚拟的文件列表(文件在硬盘中不存在),想根据文件扩展名在listview中显示出他在本机系统中的默认图标.
高分请教.可以再加分.
var
SysIL: THandle;
SFI: TSHFileInfo;
begin
//flag=1 取大图标,2取小图标
if flag=1 then
SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),SHGFI_SYSICONINDEX or SHGFI_LARGEICON)
else
SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
if SysIL <> 0 then
begin
imagelist.Handle := SysIL;
imagelist.ShareImages := TRUE;
end;
end;
function GetIconIndex(const AFile: string; Attrs: DWORD): integer;
var
SFI: TSHFileInfo;
begin
SHGetFileInfo(PChar(AFile), Attrs, SFI, SizeOf(TSHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES);
Result := SFI.iIcon;
end;AFile写不存在文件名应该也没问题
上边的可以,如果我想得到目录的图标该怎样写呢,我的目录也是不虚拟的,在盘中不存在
如mydir 是我的目录名,上面可能得到的是无法识别类型的文件图标
我该怎样得到目录图标(两种,文件夹关闭和打开时的显示图标)
目录也是虚拟的, 上边的输入多了个不字.
解决后马上结贴.
图标在注册表的位置:
HKEY_CLASSES_ROOT\.txt\ 的默认键值是txtfile
所以:
HKEY_CLASSES_ROOT\txtfile\DefaultIcon\的默认键值是:
%SystemRoot%\system32\shell32.dll,-152这说明它使用了shell32.dll中的第153个图标
procedure TForm1.Button1Click(Sender: TObject);
var
SHFI:TSHFileInfo;
sTmp: tstrings;
begin
sTmp:=tstringlist.create;
try
sTmp.SaveToFile(Edit1.text);
SHGetFileInfo(PChar(edit1.text),0,SHFI,SizeOf(SHFI),SHGFI_ICON or SHGFI_TYPENAME);
Image1.Picture.Icon.Handle:=SHFI.hIcon;
DeleteFile(edit1.text);
finally
sTmp.free;
end;
end;