如何获取驱动器、设备或文件的默认系统图标

Guy*_*ush 4 delphi winapi icons

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

在当前计算机中,首先我使用“OnCreate”事件用外壳图标(来自同一台当前计算机)填充 TListImage 并将其与将显示文件列表的 ListView 链接。因此,一旦收到列表,我就使用下面的这个函数在 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;
Run Code Online (Sandbox Code Playgroud)

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

例如,我的目标是获得一个默认的图标为一个本地硬盘跳水,一次默认图标为远程磁盘,CD / DVD设备等等...

抱歉有错误,英语不是我的母语。我尽力解释。

也许我需要的是不可能的,请告诉我...

谢谢!

fan*_*cco 6

您绝对必须使用SHGetStockIconInfo 函数

HRESULT SHGetStockIconInfo(
          SHSTOCKICONID   siid,
          UINT            uFlags,
  _Inout_ SHSTOCKICONINFO *psii
);
Run Code Online (Sandbox Code Playgroud)

SHSTOCKICONIDsiid类型的参数用于标识要检索的股票系统图标

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;
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用上面的方法GetDefaultSystemIcon(SIID_DRIVECD)来获取默认的CDROM 驱动器图标索引。


来自微软文档:

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

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

注意,以下单元的使用仅限SHGetStockIconInfoshell32.dll系统库中函数的可用性- 即导出函数需要该库。

HRESULT SHGetStockIconInfo(
          SHSTOCKICONID   siid,
          UINT            uFlags,
  _Inout_ SHSTOCKICONINFO *psii
);
Run Code Online (Sandbox Code Playgroud)