使用SHGetKnownFolderPath/SHGetFileInfo获取的系统文件夹图标出现异常覆盖层
解决系统文件夹图标带额外覆盖层的问题
你遇到的问题是因为SHGetFileInfo针对已知系统文件夹(比如桌面)的路径查询时,会返回系统默认带有特殊标识叠加层的图标——这是系统用来区分特殊文件夹的设计。要得到和资源管理器一致的无叠加图标,可以用以下两种方法:
方法一:强制获取通用文件夹图标
通过给SHGetFileInfo添加SHGFI_USEFILEATTRIBUTES参数,让函数不实际访问目标路径,而是根据文件夹属性返回通用图标,避开叠加层:
PWSTR path; SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &path); SHFILEINFO shinfo = {0}; // 传入空路径+文件夹属性,搭配SHGFI_USEFILEATTRIBUTES获取通用图标 SHGetFileInfo(L"", FILE_ATTRIBUTE_DIRECTORY, &shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES); HICON hDirIcon = shinfo.hIcon; // 添加到ImageList ImageList_AddIcon(hImageList, hDirIcon); // 别忘了释放资源 CoTaskMemFree(path); DestroyIcon(hDirIcon);
方法二:直接获取系统标准文件夹图标
如果不需要对应特殊文件夹的自定义图标,只是要纯基础文件夹样式,用SHGetStockIconInfo更直接:
SHSTOCKICONINFO sii = { sizeof(SHSTOCKICONINFO) }; // SIID_FOLDER对应标准文件夹图标,SHGSI_ICON指定返回图标句柄 SHGetStockIconInfo(SIID_FOLDER, SHGSI_ICON, &sii); HICON hDirIcon = sii.hIcon; ImageList_AddIcon(hImageList, hDirIcon); // 释放资源 DestroyIcon(hDirIcon);
你之前尝试的FILE_ATTRIBUTE_NORMAL没用,是因为问题核心不是文件属性,而是SHGetFileInfo会加载特殊文件夹的专属图标(带系统叠加),而非通用样式。
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

