开发时需要获取文件图标并呈现,网上找的大多是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");

qq图标

第二种方式是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();
        }
    }
}
最后修改:2022 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏