首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在使用SpecialFolder时得到了错误的SHFileInfo图标?

为什么我在使用SpecialFolder时得到了错误的SHFileInfo图标?
EN

Stack Overflow用户
提问于 2013-09-11 16:16:19
回答 1查看 1K关注 0票数 2

我使用SHFileInfo检索文件和文件夹的系统图标,但是我发现特殊文件夹没有返回正确的文件夹图标。

例如,桌面文件夹将返回与常规文件夹而不是桌面图标相同的文件夹图标,而MyComputer图标看起来像我所期望的旧Windows 98图标而不是Windows 7 MyComputer图标。

为什么我为特殊文件夹获取了错误的图标,以及如何使用SHFileInfo检索特殊文件夹的正确系统图标

我的原始代码来自这篇代码项目文章,但是它已经被修改了一些。但是,实际执行的代码仍然非常相似,如下所示:

代码语言:javascript
复制
public static System.Drawing.Icon GetFolderIcon(string folderPath, IconSize size, FolderType folderType)
{
    try
    {
        // Need to add size check, although errors generated at present!
        Int64 flags = WinApi.SHGFI_ICON | WinApi.SHGFI_USEFILEATTRIBUTES;

        if (FolderType.Open == folderType)
            flags |= WinApi.SHGFI_OPENICON;

        if (IconSize.Small == size)
            flags |= WinApi.SHGFI_SMALLICON;
        else
            flags |= WinApi.SHGFI_LARGEICON;

        // Get the folder icon
        WinApi.SHFILEINFO shfi = new WinApi.SHFILEINFO();
        WinApi.SHGetFileInfo(folderPath,
            WinApi.FILE_ATTRIBUTE_DIRECTORY,
            ref shfi,
            (Int32)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
            flags);

        if (shfi.hIcon == IntPtr.Zero)
            return null;

        // Now clone the icon, so that it can be successfully stored in an ImageList
        System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();

        WinApi.DestroyIcon(shfi.hIcon);     // Cleanup
        return icon;
    }
    catch (Exception ex)
    {
        // Log Error
    }

    return null;
}

它的电话看起来是这样的:

代码语言:javascript
复制
var icon = IconUtil.GetFolderIcon(
    Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
    IconUtil.IconSize.Large, IconUtil.FolderType.Closed);

我有像这样的图标

而不是这个

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-11 18:18:06

根据MSDNSHGFI_USEFILEATTRIBUTES标志:

指示函数不应尝试访问pszPath指定的文件。相反,它应该像pszPath指定的文件与dwFileAttributes中传递的文件属性一样存在。

我认为陈钟泰的评论提供了一个更容易理解的解释:

您传递了SHGFI_USEFILEATTRIBUTES,意思是“忽略文件的实际内容,假装它是我告诉您的。”您的假装文件属性是FILE_ATTRIBUTE_DIRECTORY,意思是“只是一个普通乏味的目录”。

因此,要解决我的问题,我只需要删除SHGFI_USEFILEATTRIBUTES标志,当我想要获得一个文件夹特定的图标。

埃里克·布朗的评论还提供了一种使用PIDL进行此操作的有用的替代方法。这方面的代码示例可以找到这里

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18746318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档