delphi – 可以从Vista Shell获取48×48或64×64图标?

如果Vista Shell中存在48×48或64×64图标,您可以使用SHGetFileInfo如何获取timage显示的句柄?

我想从一个代表文件夹路径的图像列表中选择一个图标,并在timage显示一个48×48或64×64的图标。

// load the large system image for the current path into Image1
SHGetFileInfo( PChar( CurrentPath ),FILE_ATTRIBUTE_norMAL,SFI,SizeOf( TSHFileInfo ),SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SHELLICONSIZE or
             SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_disPLAYNAME );
aimageIndex := SFI.iIcon;
ImageList2.GetBitmap( aimageIndex,Image1.Picture.Bitmap );

法案

解决方法

您必须使用 SHGetImageList功能,以获得具有较大图标的图像列表。

这里有一个例子在delphi中

uses ShellApi,Commctrl,ShlObj;

const
  SHIL_LARGE     = $00;  //The image size is normally 32x32 pixels. However,if the Use large icons option is selected from the Effects section of the Appearance tab in display Properties,the image is 48x48 pixels.
  SHIL_SMALL     = $01;  //These images are the Shell standard small icon size of 16x16,but the size can be customized by the user.
  SHIL_EXTRALARGE= $02;  //These images are the Shell standard extra-large icon size. This is typically 48x48,but the size can be customized by the user.
  SHIL_SYSSMALL  = $03;  //These images are the size specified by GetSystemMetrics called with SM_CXSMICON and GetSystemMetrics called with SM_CYSMICON.
  SHIL_JUMBO     = $04;  //Windows Vista and later. The image is normally 256x256 pixels.
  IID_IImageList: TGUID= '{46EB5926-582E-4017-9FDF-E8998DAA0950}';

function GetimageListSH(SHIL_FLAG:Cardinal): HIMAGELIST;
type
  _SHGetimageList = function (iImageList: integer; const riid: TGUID; var ppv: Pointer): hResult; stdcall;
var
  Handle        : THandle;
  SHGetimageList: _SHGetimageList;
begin
  Result:= 0;
  Handle:= LoadLibrary('Shell32.dll');
  if Handle<> S_OK then
  try
    SHGetimageList:= GetProcAddress(Handle,PChar(727));
    if Assigned(SHGetimageList) and (Win32Platform = VER_PLATFORM_WIN32_NT) then
      SHGetimageList(SHIL_FLAG,IID_IImageList,Pointer(Result));
  finally
    FreeLibrary(Handle);
  end;
end;


Procedure GetIconFromFile(aFile:String; var aIcon : TIcon;SHIL_FLAG:Cardinal);
var
  aimgList    : HIMAGELIST;
  SFI         : TSHFileInfo;
Begin
    //Get the index of the imagelist
    SHGetFileInfo(PChar(aFile),SHGFI_ICON or SHGFI_LARGEICON or SHGFI_SHELLICONSIZE or
                 SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_disPLAYNAME );

    if not Assigned(aIcon) then
    aIcon:= TIcon.Create;
    //get the imagelist
    aimgList:= GetimageListSH(SHIL_FLAG);
    //extract the icon handle
    aIcon.Handle:= ImageList_GetIcon(aimgList,Pred(ImageList_GetimageCount(aimgList)),ILD_norMAL);
End;

你可以这样使用这些功能

var
 hicon :TIcon;
begin
    hicon:= TIcon.Create;
    try
     GetIconFromFile('C:\Tools\reflector\readme.htm',hicon,SHIL_JUMBO);
     Image1.Picture.Icon.Assign(hIcon); //assign to timage
    finally
     hIcon.Free;
    end;
end;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...