【问题标题】:Fastest way to get shell icon获取shell图标的最快方法
【发布时间】:2012-03-03 01:00:08
【问题描述】:

我正在使用此代码获取 shell 图标(显示在 Windows 资源管理器中的那个)。
有没有人有更快的方法来获取这些图标的经验? SHGetFileInfo 似乎很慢。

procedure TForm2.Button1Click(Sender: TObject);
var
  FileInfo: TSHFileInfo;
begin
  FillChar(FileInfo, SizeOf(FileInfo), 0);
  if SHGetFileInfo(PChar('c:\windows\'), 0, FileInfo, SizeOf(FileInfo),
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then 
    DrawIconEx(Canvas.Handle, 10, 10, FileInfo.hIcon, 0, 16, 16, 0, DI_IMAGE or 
      DI_MASK);
end;

谢谢!

【问题讨论】:

  • 我过去使用过这种方法,在 C++ 应用程序中没有任何问题。不过有一点不同,我只使用了标志SHGFI_ICONSHGFI_USEFILEATTRIBUTES
  • 是的,如果速度是一个问题,一定要使用SHGFI_USEFILEATTRIBUTES。这样,SHGetFileInfo() 会跳过查询实际文件的属性,这可能需要一些时间。

标签: windows delphi winapi shell icons


【解决方案1】:

也尝试使用 SHGFI_USEFILEATTRIBUTES 标志。有关详细信息,请参阅文章 Tuning SHGetFileInfo for Optimum PerformanceWhat does SHGFI_USEFILEATTRIBUTES mean?

【讨论】:

  • +1,一系列快速测量(获取文件图标信息 10k 次)证实了我最好的建议是您的建议(从大约 18 秒到 11 秒)。我的建议(使用 shell 图像列表)将其调整到大约。 10s,其中大约 0.5s 需要初始获取图像列表句柄。
【解决方案2】:

我在使用 SHGetFileInfo 时使用了缓存。除非它是 .exe 或 .ico 文件(可能还有更多),否则对于相同的文件扩展名,图标将是相同的,因此当您显示目录列表时,您可以对相同类型的文件使用相同的图标,并且您不必再次调用(并等待)SHGetFileInfo。

【讨论】:

  • 你怎么知道要缓存什么?任何类型都可以有动态图标,.ico 和 .bmp 等的 %1 以及任何类型的 shell 扩展...
  • @TLama,缓存的想法是避免为每个文件调用SHGetFileInfo,因为它很慢,所以只有在遇到新文件类型时才需要调用它。
  • @Anders,是的,你是对的,这并不完全安全,因为不同的类型可能没有固定的图标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2021-08-03
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多