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设备等等...
抱歉有错误,英语不是我的母语。我尽力解释。
也许我需要的是不可能的,请告诉我...
谢谢!
您绝对必须使用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项目中。
请注意,以下单元的使用仅限SHGetStockIconInfo于shell32.dll系统库中函数的可用性- 即导出函数需要该库。
HRESULT SHGetStockIconInfo(
SHSTOCKICONID siid,
UINT uFlags,
_Inout_ SHSTOCKICONINFO *psii
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2347 次 |
| 最近记录: |