获取程序图标

2024-01-12

我正在制作一个类似资源管理器的应用程序来浏览存储在我的计算机上的文件。我的应用程序将处于“图标”视图中。问题是:如何显示exe文件的图标?


有几种方法可以做到这一点。最简单的可能是添加对System.Drawing并利用Icon.ExtractAssociatedIcon method:

public static ImageSource GetIcon(string fileName)
{
    Icon icon = Icon.ExtractAssociatedIcon(fileName);
    return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
                icon.Handle, 
                new Int32Rect(icon.Width, icon.Height),
                BitmapSizeOptions.FromEmptyOptions());
}

如果您不想使用,还有另一个选择System.Drawing,就是从SHGetFileInfoAPI。它更困难,但也更灵活;例如,您可以根据扩展名获取不存在的文件的图标(当然对于可执行文件来说它不是很有用,因为它会返回可执行文件的默认图标)。

public static ImageSource GetIcon(string path, bool smallIcon, bool isDirectory)
{
    // SHGFI_USEFILEATTRIBUTES takes the file name and attributes into account if it doesn't exist
    uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
    if (smallIcon)
        flags |= SHGFI_SMALLICON;

    uint attributes = FILE_ATTRIBUTE_NORMAL;
    if (isDirectory)
        attributes |= FILE_ATTRIBUTE_DIRECTORY;

    SHFILEINFO shfi;
    if (0 != SHGetFileInfo(
                path,
                attributes,
                out shfi,
                (uint)Marshal.SizeOf(typeof(SHFILEINFO)),
                flags))
    {
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
                    shfi.hIcon, 
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());
    }
    return null;
}

[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO
{
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
}

    [DllImport("shell32")]
    private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, uint flags);

private const uint FILE_ATTRIBUTE_READONLY = 0x00000001;
private const uint FILE_ATTRIBUTE_HIDDEN = 0x00000002;
private const uint FILE_ATTRIBUTE_SYSTEM = 0x00000004;
private const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
private const uint FILE_ATTRIBUTE_ARCHIVE = 0x00000020;
private const uint FILE_ATTRIBUTE_DEVICE = 0x00000040;
private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
private const uint FILE_ATTRIBUTE_TEMPORARY = 0x00000100;
private const uint FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200;
private const uint FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400;
private const uint FILE_ATTRIBUTE_COMPRESSED = 0x00000800;
private const uint FILE_ATTRIBUTE_OFFLINE = 0x00001000;
private const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000;
private const uint FILE_ATTRIBUTE_ENCRYPTED = 0x00004000;
private const uint FILE_ATTRIBUTE_VIRTUAL = 0x00010000;

private const uint SHGFI_ICON = 0x000000100;     // get icon
private const uint SHGFI_DISPLAYNAME = 0x000000200;     // get display name
private const uint SHGFI_TYPENAME = 0x000000400;     // get type name
private const uint SHGFI_ATTRIBUTES = 0x000000800;     // get attributes
private const uint SHGFI_ICONLOCATION = 0x000001000;     // get icon location
private const uint SHGFI_EXETYPE = 0x000002000;     // return exe type
private const uint SHGFI_SYSICONINDEX = 0x000004000;     // get system icon index
private const uint SHGFI_LINKOVERLAY = 0x000008000;     // put a link overlay on icon
private const uint SHGFI_SELECTED = 0x000010000;     // show icon in selected state
private const uint SHGFI_ATTR_SPECIFIED = 0x000020000;     // get only specified attributes
private const uint SHGFI_LARGEICON = 0x000000000;     // get large icon
private const uint SHGFI_SMALLICON = 0x000000001;     // get small icon
private const uint SHGFI_OPENICON = 0x000000002;     // get open icon
private const uint SHGFI_SHELLICONSIZE = 0x000000004;     // get shell size icon
private const uint SHGFI_PIDL = 0x000000008;     // pszPath is a pidl
private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;     // use passed dwFileAttribute

这种方法的另一个优点是它还可以获取目录的图标(请参阅代码中的最后编辑),这是不可能的Icon.ExtractAssociatedIcon

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取程序图标 的相关文章

随机推荐

  • WPF 访问列表视图代码隐藏的滚动查看器

    我需要从代码隐藏访问列表视图的滚动查看器 这是我的列表视图的定义
  • Python mysql.connector.errors。 %s 已传递给带引号的 SQL 查询

    我在Python中执行以下代码 cursor execute SHOW DATABASES ans dblist cursor fetchall for db name in ans dblist cursor execute SHOW T
  • Scala 相当于 Haskell 的 do-notation(再次)

    我知道哈斯克尔的 do x lt 1 2 3 y lt 7 8 9 let z x y return z 在Scala中可以表示为 for x lt List 1 2 3 y lt List 7 8 9 z x y yield z 但是 尤
  • 具有 Charfield 计数和零值的 Django 模型

    我有一个 Django 数据库模型 它有一些属性 其中之一是带有选项的 Charfield 类别 我现在想用每个类别的行数来注释该模型的查询集 问题是 我知道这样做的方式 只有查询集中存在的类别才会被计数 但我想要一个查询集 其中所有类别都
  • 来自守护进程的错误响应:获取 https://registry-1.docker.io/v2/:拨打 tcp:查找registry-1.docker.io...i/o 超时

    我试图从 docker io 中提取图像 但收到此错误 最近我更改了 DNS 我不确定这就是原因 我执行了minikube ssh我执行了docker pull然后我得到了这个错误 Error response from daemon Ge
  • OpenLayers:如何计算两点之间的距离?

    如何使用墨卡托投影计算 OpenLayers 中两点之间的距离 Thanks use point1 distanceTo point2 var Geographic new OpenLayers Projection EPSG 4326 v
  • 将 INT 转换为 DATETIME (SQL)

    我正在尝试将日期转换为日期时间 但出现错误 我要转换的数据类型是 float null 我想将其转换为 DATETIME 该代码的第一行工作正常 但我在第二行收到此错误 将表达式转换为数据类型日期时间时出现算术溢出错误 CAST CAST
  • 是否可以在 Windows 上构建 ffmpeg x64?

    真正的答案可能是 不 但仍然需要仔细检查 有没有人能够在 Windows VS2013 或 VS2015 上构建 ffmpeg x64 我知道 如果不进行大量修改 公开可用的资源是不可能的 然而 如果有人做到了并且他愿意分享一些技巧 编辑
  • 使用 Flutter Firestore 插件,为文档中的每个子集合执行一些操作

    为了帮助我更好地了解 Flutter 和 Firebase 我正在制作一个列表共享应用程序 我正在处理列表主屏幕 该屏幕将显示可重新排序的列表图块视图 其中每个用户列表都有一个图块 我还没有开始研究这些列表内部的内容 我已经设置了 fire
  • 在 Ruby 中比较序列

    假设我必须 中小型 数组 tokens aaa ccc xxx bbb ccc yyy zzz template aaa bbb ccc 我怎样才能确定是否tokens包含所有条目template 按照同样的顺序 请注意 在上面的示例中 应
  • 无法多次重写 jQuery UI 自动完成 renderItem 方法

    它会在找到的第一个自动完成中正确覆盖 但对其余部分不执行任何操作 相反 它加载原始的 renderitem 方法 您可以在以下位置看到https github com jquery jquery ui blob master ui jque
  • 检查 Azure 资源组是否存在 - Azure Powershell

    我试图验证 ResourceGroup 是否存在 所以我认为以下代码应该返回 true 或 false 但它不输出任何内容 RSGtest Find AzureRmResource Format List ResourceGroupName
  • Rails 的 concat 方法和 do...end 块不起作用

    我刚刚读到 Rails 的concat清理在这里输出内容的助手的方法http thepugautomatic com 2013 06 helpers http thepugautomatic com 2013 06 helpers 我尝试了
  • 根据多个架构定义验证 XML 文件

    我正在尝试根据许多不同的模式验证 XML 文件 对人为的示例表示歉意 a xsd b xsd c xsd c xsd 特别是导入 b xsd 和 b xsd 导入 a xsd 使用
  • SQLiteDatabase close() 函数在多线程时导致 NullPointerException

    我在我的项目中发现 Android 上的 SQLiteDatabase 实现中的 close 函数在运行打开数据库 插入数据然后关闭数据库的多个线程时会引发 NullPointerException 一切都运行顺利 除非我允许每个线程在插入
  • 如何在 VBA (Excel 2010) 中将默认情况恢复为变量?

    在某些时候我不小心命名了一个变量range 全部小写 从那时起 Visual Basic for Applications 编辑器拒绝使用Range 帕斯卡大小写 它会自动将其更正为小写 我怎样才能重置它的 大脑 以忘记我过去的违规行为 注
  • ICS 文件内的超链接问题

    我创建了一个 ICS 文件 它有一个文本的超链接 在 Outlook 2013 中 它运行良好 但在其他电子邮件客户端中 它会向我显示完整的 URL 以及超链接文本 请参阅下面的屏幕截图 MAC OS 笔记本电脑 http img en25
  • 段落中每个单词的第一个字母的样式

    我正在尝试使用样式设置段落的第一个字母CSS并想使用 greensock 添加一些动画 但实际上要求是设置每个单词的第一个字母的样式 而不仅仅是第一个字母段落 对此有何建议 想法 p font size 150 color 000000 p
  • 根据url隐藏div

    抱歉 如果这是另一个转发 我一直在尝试寻找解决方案 但我尝试过的任何方法都不起作用 我正在使用一个我可以完全控制 html 的博客 我通常可以找到基本 html 的方法 但当涉及到 Java 或 CSS 时 我完全是个新手 抱歉 我什么都不
  • 获取程序图标

    我正在制作一个类似资源管理器的应用程序来浏览存储在我的计算机上的文件 我的应用程序将处于 图标 视图中 问题是 如何显示exe文件的图标 有几种方法可以做到这一点 最简单的可能是添加对System Drawing并利用Icon Extrac