以下是Windows文档中有关SHGetFileInfo()
函数的摘录:
您应该从后台线程调用此函数。否则可能会导致UI停止响应。
这是否也适用于提取文件夹图标?
我们的一个应用程序类似于Windows资源管理器,我们追求两个对立的目标:支持尽可能多的Windows资源管理器功能,并尽可能快。考虑到后者,我为每个文件夹分配了默认图标(在SHGFI_USEFILEATTRIBUTES
标志的帮助下获得)。但是事实证明,一段时间后,我们的一些客户使用了自定义文件夹图标。
因此,考虑到自定义文件夹图标的数量可以忽略不计,我应该创建新线程来计算每个文件夹的图标,还是有办法快速在主线程中提取文件夹图标?
例如,我认为一种仅检索缓存图标的方法可能是一种解决方案。有一个功能IShellItemImageFactory::GetImage()
,该功能只允许获取缓存的图标,但是很遗憾,它返回的是HBITMAP
而不是HICON
。
答案 0 :(得分:0)
似乎我找到了适当的解决方案。 首先,我准备并存储一个包含默认文件夹图标及其索引的索引对,并将它们存储在系统映像列表中。然后,当对文件夹图标的请求到达时,我立即返回默认图标,并从Windows线程池中启动线程。
在启动的线程中,我借助SHGetFileInfo API计算实际的文件夹图标及其索引。如果索引与默认图标的索引相同,则销毁该图标。仅当获取的索引与默认的图标索引不同时,我才会在主线程中将通知发布到控件。
通过这种方式,仅向控件通知真正具有自定义图标的文件夹,并且主线程不会因多余的通知而负担过多。