0

0

C#获取文件图标 C#如何提取文件在Windows中的显示图标

幻夢星雲

幻夢星雲

发布时间:2026-02-08 09:03:10

|

630人浏览过

|

来源于php中文网

原创

SHGetFileInfo是获取Windows原生文件图标的最可靠方式,支持多尺寸、叠加层及真实Shell渲染效果;需用Icon.FromHandle转换并手动DestroyIcon释放,路径须绝对化,标志位需完整设置。

c#获取文件图标 c#如何提取文件在windows中的显示图标

SHGetFileInfo 获取文件图标句柄最可靠

Windows 原生图标(包括不同大小、状态)必须通过 Shell API 提取,.NET 自带的 Icon.ExtractAssociatedIcon 只能拿到小尺寸(16×16)且常缓存过期,对快捷方式、注册表关联缺失的文件经常返回默认图标。SHGetFileInfo 是唯一能按需获取 16/32/48/256px 图标、叠加层(如快捷方式箭头、加密锁)、以及真实 Shell 渲染效果的途径。

关键点:

  • SHGetFileInfo 返回的是 GDI HICON,需用 Icon.FromHandle 转为托管 Icon,但注意:该句柄**不能直接释放**,否则图标立刻失效;应调用 DestroyIcon 手动清理(尤其在循环加载大量图标时)
  • 必须传入 SHGFI_ICON | SHGFI_LARGEICONSHGFI_SMALLICON 控制尺寸,仅传 SHGFI_ICON 默认返回小图标
  • 路径必须是**绝对路径**,相对路径或 UNC 路径(如 \\server\share\file.txt)需先用 Path.GetFullPath 规范化,否则返回空图标

SHGetFileInfo 的典型调用参数组合

以下是最常用且稳定的参数组合(C# P/Invoke):

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(
    string pszPath,
    uint dwFileAttributes,
    out SHFILEINFO psfi,
    uint cbSizeFileInfo,
    uint uFlags);

[StructLayout(LayoutKind.Sequential)] public 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; }

// 示例:获取 32×32 图标(含叠加层) var shinfo = new SHFILEINFO(); var flags = (uint)(0x000000100 | // SHGFI_ICON 0x000000040 | // SHGFI_LARGEICON (32×32) 0x000000002 | // SHGFI_USEFILEATTRIBUTES (无文件时可用属性模拟) 0x000000010); // SHGFI_OVERLAYINDEX (需要叠加层索引)

SHGetFileInfo(filePath, 0, out shinfo, (uint)Marshal.SizeOf(shinfo), flags); if (shinfo.hIcon != IntPtr.Zero) { var icon = Icon.FromHandle(shinfo.hIcon); // 使用 icon... }

注意:SHGFI_USEFILEATTRIBUTES 允许传入不存在的路径(比如只给扩展名),此时需手动指定 dwFileAttributes(如 FileAttributes.Directory),否则图标为空。

文赋Ai论文
文赋Ai论文

专业/高质量智能论文AI生成器-在线快速生成论文初稿

下载

处理图标缩放与 DPI 缩放问题

直接从 SHGetFileInfo 拿到的图标是位图格式,不随系统 DPI 缩放自动适配。若目标控件(如 ListViewTreeView)启用了高 DPI 模式,图标会模糊或错位:

  • 不要对原始图标调用 icon.ToBitmap() 后再缩放——会失真;应优先用 SHGFI_LARGEICON + SHGFI_JUMBOICON(Windows 10+)获取原生大尺寸图标
  • 若必须缩放,用 Graphics.DrawImage 并设置 InterpolationMode.HighQualityBicubicSmoothingMode.AntiAlias
  • ImageList,务必在创建时指定 ImageList.ColorDepth = ColorDepth.Depth32Bit,否则透明通道丢失,叠加层变黑块

快捷方式(.lnk)和特殊文件类型图标容易出错

.lnk 文件默认显示目标文件图标,但 SHGetFileInfo 对它行为不稳定——有时返回 lnk 自身图标(带箭头),有时返回目标图标,取决于系统缓存和是否已解析过该链接:

  • 安全做法:先用 ShellLinkObject(COM)解析 .lnk,拿到真实目标路径后再调用 SHGetFileInfo
  • 对虚拟文件(如 OneDrive 同步状态图标、WslFs 路径),SHGFI_USEFILEATTRIBUTES 常失效,必须确保路径可被 Shell 正确识别(例如 WSL 路径要转成 \\wsl$\… 格式)
  • 注册表中未关联扩展名的文件(如 .xyz),即使存在,也会回退到空白文档图标;此时可尝试用 SHGFI_USEFILEATTRIBUTES + FILE_ATTRIBUTE_NORMAL 强制走通用图标逻辑

真正麻烦的不是怎么拿图标,而是怎么让图标在各种路径、DPI、文件状态组合下保持一致——多数问题出在路径规范化和标志位漏设,而不是代码本身。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

954

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1139

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

815

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

457

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2355

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1731

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

1643

2023.08.30

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.7万人学习

Excel 教程
Excel 教程

共162课时 | 16.1万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号