如何获取驱动器,设备或文件的默认系统图标 [英] How to get the default system icon for a drive, a device or a file

查看:239
本文介绍了如何获取驱动器,设备或文件的默认系统图标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个远程文件管理器。服务器端应用程序获取计算机中的驱动程序,目录和文件列表,将其另存为流,并将其发送到我所在的当前计算机中。一切正常。



在当前的电脑中,首先我使用OnCreate事件来填充一个带有图标的TListImage(来自同一个当前的计算机),并将其链接到ListView将显示文件列表。所以,一旦收到列表,我使用下面的函数来显示ListView中的通用文件图标:

 函数GetGenericFileIconIndex(文件名:string):整数; 
var
FInfo:TSHFileInfo;
begin
结果:= -1;
if(SHGetFileInfo(PChar(Filename),FILE_ATTRIBUTE_NORMAL,FInfo,SizeOf(FInfo),
SHGFI_SYSICONINDEX或SHGFI_USEFILEATTRIBUTES)0)then
结果:= FInfo.iIcon;
结束

for I:= 0 to Pred(List.Count)do
begin
Item:= ListView.Items.Add;
Item.ImageIndex:= GetGenericFileIconIndex(List [I]);
Item.Caption:= List [I];
结束

使用文件名/扩展名即使在不同的计算机中也可以获得正确的shell图标。但是我也需要显示正确的驱动器类型图标。例如,在远程计算机上,D:\是本地固定驱动器,但目前的计算机D:\是CD / DVD驱动器,因此无法使用驱动器号来获取此图标。我需要一种从远程计算机(固定驱动器)获取通用驱动器类型图标索引并将其发送到当前计算机的方法。



例如,我的目标是获取本地硬式潜水的默认图标,远程磁盘的默认图标,CD / DVD设备等...



对不起,错误,英语不是我的母语。我尽力解释。



也许我需要的是不可能的,只是让我知道...



谢谢!

解决方案

你绝对必须使用 SHGetStockIconInfo功能

  HRESULT SHGetStockIconInfo(
SHSTOCKICONID siid,
UINT uFlags,
_Inout_ SHSTOCKICONINFO * psii
);

siid 参数=https://msdn.microsoft.com/en-us/library/windows/desktop/bb762542(v=vs.85).aspx =nofollow> SHSTOCKICONID 用于识别哪些库存系统图标来检索。

  function GetDefaultSystemIcon(ASiid:Integer):Integer; 
var
sInfo:TSHStockIconInfo;
begin
sInfo.cbSize:= SizeOf(TSHStockIconInfo);
如果S_OK = SHGetStockIconInfo(ASiid,SHGSI_SYSICONINDEX,sInfo)然后
结果:= sInfo.iSysImageIndex
else
结果:= -1;
结束

您可以像这样 GetDefaultSystemIcon(SIID_DRIVECD)获得 CDROM驱动器图标索引。






从Microsoft文档:


最低支持客户端     Windows Vista [仅限桌面应用程序]

最低支持的服务器    Windows Server 2008 [仅限桌面应用程序]


较旧的 ShellAPI 单位可能没有 SHGetStockIconInfo 声明:在这种情况下,以下单位必须添加到 Delphi 项目。



通知,以下单位的使用仅限于 shell32.dll 系统库中的SHGetStockIconInfo 函数,即导出函数所需的库。

  unit MyShellAPI; 

接口

使用
Windows;

type
SHSTOCKICONID =整数;

_SHSTOCKICONINFO =记录
cbSize:Cardinal;
hIcon:HICON;
iSysImageIndex,
iIcon:Integer;
szPath:打包数组[0..MAX_PATH-1]的Char;
结束
SHStockIconInfo = _SHSTOCKICONINFO;
TSHStockIconInfo = SHSTOCKICONINFO;
PSHStockIconInfo = ^ TSHStockIconInfo;

const
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx
SHGFI_ADDOVERLAYS = $ 000000020;
SHGFI_ATTR_SPECIFIED = $ 000020000;
SHGFI_ATTRIBUTES = $ 000000800;
SHGFI_DISPLAYNAME = $ 000000200
SHGFI_EXETYPE = $ 000002000;
SHGFI_ICON = $ 000000100;
SHGFI_ICONLOCATION = $ 000001000;
SHGFI_LARGEICON = $ 000000000;
SHGFI_LINKOVERLAY = $ 000008000;
SHGFI_OPENICON = $ 000000002;
SHGFI_OVERLAYINDEX = $ 000000040;
SHGFI_PIDL = $ 000000008;
SHGFI_SELECTED = $ 000010000;
SHGFI_SHELLICONSIZE = $ 000000004;
SHGFI_SMALLICON = $ 000000001;
SHGFI_SYSICONINDEX = $ 000004000;
SHGFI_TYPENAME = $ 000000400;
SHGFI_USEFILEATTRIBUTES = $ 000000010;

//https://msdn.microsoft.com/en-us/library/windows/desktop/bb762205(v=vs.85).aspx
SHGSI_ICONLOCATION = 0;
SHGSI_ICON = SHGFI_ICON;
SHGSI_SYSICONINDEX = SHGFI_SYSICONINDEX;
SHGSI_LINKOVERLAY = SHGFI_LINKOVERLAY;
SHGSI_SELECTED = SHGFI_SELECTED;
SHGSI_LARGEICON = SHGFI_LARGEICON;
SHGSI_SMALLICON = SHGFI_SMALLICON;
SHGSI_SHELLICONSIZE = SHGFI_SHELLICONSIZE;

//https://msdn.microsoft.com/en-us/library/windows/desktop/bb762542%28v=vs.85%29.aspx
SIID_DOCNOASSOC = 0;
SIID_DOCASSOC = 1;
SIID_APPLICATION = 2;
SIID_FOLDER = 3;
SIID_FOLDEROPEN = 4;
SIID_DRIVE525 = 5;
SIID_DRIVE35 = 6;
SIID_DRIVEREMOVE = 7;
SIID_DRIVEFIXED = 8;
SIID_DRIVENET = 9;
SIID_DRIVENETDISABLED = 10;
SIID_DRIVECD = 11;
SIID_DRIVERAM = 12;
SIID_WORLD = 13;
SIID_SERVER = 15;
SIID_PRINTER = 16;
SIID_MYNETWORK = 17;
SIID_FIND = 22;
SIID_HELP = 23;
SIID_SHARE = 28;
SIID_LINK = 29;
SIID_SLOWFILE = 30;
SIID_RECYCLER = 31
SIID_RECYCLERFULL = 32;
SIID_MEDIACDAUDIO = 40;
SIID_LOCK = 47;
SIID_AUTOLIST = 49;
SIID_PRINTERNET = 50;
SIID_SERVERSHARE = 51;
SIID_PRINTERFAX = 52;
SIID_PRINTERFAXNET = 53;
SIID_PRINTERFILE = 54;
SIID_STACK = 55;
SIID_MEDIASVCD = 56;
SIID_STUFFEDFOLDER = 57;
SIID_DRIVEUNKNOWN = 58;
SIID_DRIVEDVD = 59;
SIID_MEDIADVD = 60;
SIID_MEDIADVDRAM = 61;
SIID_MEDIADVDRW = 62;
SIID_MEDIADVDR = 63;
SIID_MEDIADVDROM = 64;
SIID_MEDIACDAUDIOPLUS = 65;
SIID_MEDIACDRW = 66;
SIID_MEDIACDR = 67;
SIID_MEDIACDBURN = 68;
SIID_MEDIABLANKCD = 69;
SIID_MEDIACDROM = 70;
SIID_AUDIOFILES = 71;
SIID_IMAGEFILES = 72;
SIID_VIDEOFILES = 73;
SIID_MIXEDFILES = 74;
SIID_FOLDERBACK = 75;
SIID_FOLDERFRONT = 76;
SIID_SHIELD = 77;
SIID_WARNING = 78;
SIID_INFO = 79;
SIID_ERROR = 80;
SIID_KEY = 81;
SIID_SOFTWARE = 82;
SIID_RENAME = 83;
SIID_DELETE = 84;
SIID_MEDIAAUDIODVD = 85;
SIID_MEDIAMOVIEDVD = 86;
SIID_MEDIAENHANCEDCD = 87;
SIID_MEDIAENHANCEDDVD = 88;
SIID_MEDIAHDDVD = 89;
SIID_MEDIABLURAY = 90;
SIID_MEDIAVCD = 91;
SIID_MEDIADVDPLUSR = 92;
SIID_MEDIADVDPLUSRW = 93;
SIID_DESKTOPPC = 94;
SIID_MOBILEPC = 95;
SIID_USERS = 96;
SIID_MEDIASMARTMEDIA = 97;
SIID_MEDIACOMPACTFLASH = 98;
SIID_DEVICECELLPHONE = 99;
SIID_DEVICECAMERA = 100;
SIID_DEVICEVIDEOCAMERA = 101;
SIID_DEVICEAUDIOPLAYER = 102;
SIID_NETWORKCONNECT = 103;
SIID_INTERNET = 104;
SIID_ZIPFILE = 105;
SIID_SETTINGS = 106;
SIID_DRIVEHDDVD = 132;
SIID_DRIVEBD = 133;
SIID_MEDIAHDDVDROM = 134;
SIID_MEDIAHDDVDR = 135;
SIID_MEDIAHDDVDRAM = 136;
SIID_MEDIABDROM = 137;
SIID_MEDIABDR = 138;
SIID_MEDIABDRE = 139;
SIID_CLUSTEREDDRIVE = 140;
SIID_MAX_ICONS = 175;

函数SHGetStockIconInfo(siid:SHSTOCKICONID; uFlags:UINT; var psii:TSHStockIconInfo):HRESULT;标准

实现

const
SHELL32 ='shell32.dll';

函数SHGetStockIconInfo;外部SHELL32名称SHGetStockIconInfo;

结束。


I am creating a remote file manager. The server side application gets the list of drivers, directories and files in the computer, saves it as stream and send it to me in the current computer where I am. Everything works fine.

In the current computer, first I use the "OnCreate" event to fill a TListImage with shell icons (from the same current computer) and link it with the ListView where the file list will be showed. So, once received the list, I use this funcion below to show the generic file icon in the ListView:

function GetGenericFileIconIndex(Filename: string): Integer;
var
  FInfo: TSHFileInfo;
begin
  Result := -1;
  if (SHGetFileInfo(PChar(Filename), FILE_ATTRIBUTE_NORMAL, FInfo, SizeOf(FInfo),
    SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) <> 0) then
    Result := FInfo.iIcon;
end;

for I := 0 to Pred(List.Count) do
begin
  Item := ListView.Items.Add;
  Item.ImageIndex := GetGenericFileIconIndex(List[I]);
  Item.Caption := List[I];
end;

With file name/extension I can get the correct shell icon, even in a different computer. But I also need to show the correct drive type icon. For example, on remote computer "D:\" is a local fixed drive, but on current computer "D:\" is a CD/DVD drive, so I cannot use the drive letter to get this icon. I need a way to get a "generic" drive type icon index from remote computer (fixed drive) and send it to the current computer.

For example, my goal is to obtain a default icon for a local hard dive, a default icon for a remote disk, a CD/DVD device and so on...

Sorry about mistakes, english is not my native language. I did my best to try to explain.

Maybe what I need is impossible, just let me know please...

Thanks!

解决方案

You definitely have to use the SHGetStockIconInfo function:

HRESULT SHGetStockIconInfo(
          SHSTOCKICONID   siid,
          UINT            uFlags,
  _Inout_ SHSTOCKICONINFO *psii
);

The siid parameter of type SHSTOCKICONID is used to identify which stock system icon to retrieve.

function GetDefaultSystemIcon(ASiid: Integer): Integer;
var
  sInfo: TSHStockIconInfo;
begin
  sInfo.cbSize := SizeOf(TSHStockIconInfo);
  if S_OK = SHGetStockIconInfo(ASiid, SHGSI_SYSICONINDEX, sInfo) then
    Result := sInfo.iSysImageIndex
  else
    Result := -1;
end;

You may call the above like this GetDefaultSystemIcon(SIID_DRIVECD) to get the default CDROM drive icon index.


From the Microsoft documentation:

Minimum supported client      Windows Vista [desktop apps only]
Minimum supported server    Windows Server 2008 [desktop apps only]

Older ShellAPI units may not have the SHGetStockIconInfo declaration: in this case the following unit must be added to the Delphi project.

Please notice that the use of the unit below is restricted to the availability of the SHGetStockIconInfo function in the shell32.dll system library - i.e. the library is required to export the function.

unit MyShellAPI;

interface

uses
  Windows;

type
  SHSTOCKICONID = Integer;

  _SHSTOCKICONINFO = record
    cbSize: Cardinal;
    hIcon: HICON;
    iSysImageIndex,
    iIcon: Integer;
    szPath: packed array [0..MAX_PATH-1] of Char;
  end;
  SHStockIconInfo = _SHSTOCKICONINFO;
  TSHStockIconInfo = SHSTOCKICONINFO;
  PSHStockIconInfo = ^TSHStockIconInfo;

const
  //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx
  SHGFI_ADDOVERLAYS       = $000000020;
  SHGFI_ATTR_SPECIFIED    = $000020000;
  SHGFI_ATTRIBUTES        = $000000800;
  SHGFI_DISPLAYNAME       = $000000200;
  SHGFI_EXETYPE           = $000002000;
  SHGFI_ICON              = $000000100;
  SHGFI_ICONLOCATION      = $000001000;
  SHGFI_LARGEICON         = $000000000;
  SHGFI_LINKOVERLAY       = $000008000;
  SHGFI_OPENICON          = $000000002;
  SHGFI_OVERLAYINDEX      = $000000040;
  SHGFI_PIDL              = $000000008;
  SHGFI_SELECTED          = $000010000;
  SHGFI_SHELLICONSIZE     = $000000004;
  SHGFI_SMALLICON         = $000000001;
  SHGFI_SYSICONINDEX      = $000004000;
  SHGFI_TYPENAME          = $000000400;
  SHGFI_USEFILEATTRIBUTES = $000000010;

  //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762205(v=vs.85).aspx
  SHGSI_ICONLOCATION = 0;
  SHGSI_ICON = SHGFI_ICON;
  SHGSI_SYSICONINDEX = SHGFI_SYSICONINDEX;
  SHGSI_LINKOVERLAY = SHGFI_LINKOVERLAY;
  SHGSI_SELECTED = SHGFI_SELECTED;
  SHGSI_LARGEICON = SHGFI_LARGEICON;
  SHGSI_SMALLICON = SHGFI_SMALLICON;
  SHGSI_SHELLICONSIZE = SHGFI_SHELLICONSIZE;

  //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762542%28v=vs.85%29.aspx
  SIID_DOCNOASSOC         = 0;
  SIID_DOCASSOC           = 1;
  SIID_APPLICATION        = 2;
  SIID_FOLDER             = 3;
  SIID_FOLDEROPEN         = 4;
  SIID_DRIVE525           = 5;
  SIID_DRIVE35            = 6;
  SIID_DRIVEREMOVE        = 7;
  SIID_DRIVEFIXED         = 8;
  SIID_DRIVENET           = 9;
  SIID_DRIVENETDISABLED   = 10;
  SIID_DRIVECD            = 11;
  SIID_DRIVERAM           = 12;
  SIID_WORLD              = 13;
  SIID_SERVER             = 15;
  SIID_PRINTER            = 16;
  SIID_MYNETWORK          = 17;
  SIID_FIND               = 22;
  SIID_HELP               = 23;
  SIID_SHARE              = 28;
  SIID_LINK               = 29;
  SIID_SLOWFILE           = 30;
  SIID_RECYCLER           = 31;
  SIID_RECYCLERFULL       = 32;
  SIID_MEDIACDAUDIO       = 40;
  SIID_LOCK               = 47;
  SIID_AUTOLIST           = 49;
  SIID_PRINTERNET         = 50;
  SIID_SERVERSHARE        = 51;
  SIID_PRINTERFAX         = 52;
  SIID_PRINTERFAXNET      = 53;
  SIID_PRINTERFILE        = 54;
  SIID_STACK              = 55;
  SIID_MEDIASVCD          = 56;
  SIID_STUFFEDFOLDER      = 57;
  SIID_DRIVEUNKNOWN       = 58;
  SIID_DRIVEDVD           = 59;
  SIID_MEDIADVD           = 60;
  SIID_MEDIADVDRAM        = 61;
  SIID_MEDIADVDRW         = 62;
  SIID_MEDIADVDR          = 63;
  SIID_MEDIADVDROM        = 64;
  SIID_MEDIACDAUDIOPLUS   = 65;
  SIID_MEDIACDRW          = 66;
  SIID_MEDIACDR           = 67;
  SIID_MEDIACDBURN        = 68;
  SIID_MEDIABLANKCD       = 69;
  SIID_MEDIACDROM         = 70;
  SIID_AUDIOFILES         = 71;
  SIID_IMAGEFILES         = 72;
  SIID_VIDEOFILES         = 73;
  SIID_MIXEDFILES         = 74;
  SIID_FOLDERBACK         = 75;
  SIID_FOLDERFRONT        = 76;
  SIID_SHIELD             = 77;
  SIID_WARNING            = 78;
  SIID_INFO               = 79;
  SIID_ERROR              = 80;
  SIID_KEY                = 81;
  SIID_SOFTWARE           = 82;
  SIID_RENAME             = 83;
  SIID_DELETE             = 84;
  SIID_MEDIAAUDIODVD      = 85;
  SIID_MEDIAMOVIEDVD      = 86;
  SIID_MEDIAENHANCEDCD    = 87;
  SIID_MEDIAENHANCEDDVD   = 88;
  SIID_MEDIAHDDVD         = 89;
  SIID_MEDIABLURAY        = 90;
  SIID_MEDIAVCD           = 91;
  SIID_MEDIADVDPLUSR      = 92;
  SIID_MEDIADVDPLUSRW     = 93;
  SIID_DESKTOPPC          = 94;
  SIID_MOBILEPC           = 95;
  SIID_USERS              = 96;
  SIID_MEDIASMARTMEDIA    = 97;
  SIID_MEDIACOMPACTFLASH  = 98;
  SIID_DEVICECELLPHONE    = 99;
  SIID_DEVICECAMERA       = 100;
  SIID_DEVICEVIDEOCAMERA  = 101;
  SIID_DEVICEAUDIOPLAYER  = 102;
  SIID_NETWORKCONNECT     = 103;
  SIID_INTERNET           = 104;
  SIID_ZIPFILE            = 105;
  SIID_SETTINGS           = 106;
  SIID_DRIVEHDDVD         = 132;
  SIID_DRIVEBD            = 133;
  SIID_MEDIAHDDVDROM      = 134;
  SIID_MEDIAHDDVDR        = 135;
  SIID_MEDIAHDDVDRAM      = 136;
  SIID_MEDIABDROM         = 137;
  SIID_MEDIABDR           = 138;
  SIID_MEDIABDRE          = 139;
  SIID_CLUSTEREDDRIVE     = 140;
  SIID_MAX_ICONS          = 175;

function SHGetStockIconInfo(siid: SHSTOCKICONID; uFlags: UINT; var psii: TSHStockIconInfo): HRESULT; stdcall;

implementation

const
  SHELL32 = 'shell32.dll';

function SHGetStockIconInfo; external SHELL32 name 'SHGetStockIconInfo';

end.

这篇关于如何获取驱动器,设备或文件的默认系统图标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆