开发时需要获取文件图标并呈现,网上找的大多是c#使用win32ap的方式获取文件图标,这种方式代码量感觉比较多;而且获取出来的图标不是很清晰。后面发现c#用System.Drawing.Icon可以获取更加清晰的图标,而且代码量也小;本文就当做个记录把。
首先介绍第一种,System.Drawing.Icon的方式获取文件图标。
//根据文件路径,获取文件的图标
System.Drawing.Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(@"D:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe");
//保存文件图标
icon.ToBitmap().Save("2.bmp");
第二种方式是win32api获取图标,代码如下
public class ExtractIcon
{
[DllImport("Shell32.dll")]
private static extern int SHGetFileInfo
(
string pszPath,
uint dwFileAttributes,
out SHFILEINFO psfi,
uint cbfileInfo,
SHGFI uFlags
);
[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO
{
public SHFILEINFO(bool b)
{
hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
}
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 80)]
public string szTypeName;
};
private ExtractIcon()
{
}
private enum SHGFI
{
SmallIcon = 0x00000001,
LargeIcon = 0x00000000,
Icon = 0x00000100,
DisplayName = 0x00000200,
Typename = 0x00000400,
SysIconIndex = 0x00004000,
UseFileAttributes = 0x00000010
}
public static Icon GetIcon(string strPath, bool bSmall)
{
SHFILEINFO info = new SHFILEINFO(true);
int cbFileInfo = Marshal.SizeOf(info);
SHGFI flags;
if (bSmall)
flags = SHGFI.Icon | SHGFI.SmallIcon | SHGFI.UseFileAttributes;
else
flags = SHGFI.Icon | SHGFI.LargeIcon | SHGFI.UseFileAttributes;
SHGetFileInfo(strPath, 256, out info, (uint)cbFileInfo, flags);
return Icon.FromHandle(info.hIcon);
}
}
win32api获取图标调用示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SafeDll
{
class Program
{
static void Main(string[] args)
{
ExtractIcon.GetIcon(@"D:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe",false).ToBitmap().Save("2.bmp");
Console.ReadKey();
}
}
}