如何获取驱动器,设备或文件的默认系统图标 [英] How to get the default system icon for a drive, a device or a file
问题描述
在当前的电脑中,首先我使用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屋!