C#通过API获取文件的关联图标

这里的文件关联图标说的是:在Windows的文件资源管理器(文件夹)中看到的文件的图标。举例说:

.txt文件的关联图标是记事本的图标
.avi文件的关联图标是默认播放器的图标
.html文件的关联图标是默认浏览器的图标

本文介绍的图标就是文件的这种关联图标。

using System.Runtime.InteropServices;
public struct SHFILEINFO
{  
 public IntPtr hIcon;  
 public IntPtr iIcon;  
 public uint dwAttributes;  
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]  
 public string szDisplayName;  
 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]  
 public string szTypeName;  
}
[DllImport("shell32.dll")]
public static extern bool SHGetFileInfo(
 string pszPath,
 int dwFileAttributes,
 ref SHFILEINFO psfi,
 int cbFileInfo,
 int uFlags
);
private void Form1_Load(object sender, EventArgs e)
{
 SHFILEINFO fileinfo = new SHFILEINFO();
 string fileName = "E:\\1.rmvb";
 
 //提取16*16用下面这句
 //SHGetFileInfo(fileName, 0, ref fileinfo, (int)Marshal.SizeOf(fileinfo), (int)(0x1 | 0x100));
 
 //提取32*32用下面这句
 SHGetFileInfo(fileName, 0, ref fileinfo, (int)Marshal.SizeOf(fileinfo), (int)(0x0 | 0x100));
 
 Icon _Icon = System.Drawing.Icon.FromHandle(fileinfo.hIcon);
 
 _Icon.ToBitmap().Save("D:\\icon.png");
}

此方法只可以实现16*16、32*32分辨率图标的提取,如果需要更大分辨率的图标,需要结合另外一个API函数(SHGetImageList):

参考

https://msdn.microsoft.com/en-us/library/bb762185(VS.85).aspx