c#获取文件图标的几种方式
侧边栏壁纸
  • 累计撰写 62 篇文章
  • 累计收到 23 条评论
C#

c#获取文件图标的几种方式

一缕清风
2021-01-31 / 0 评论 / 54 阅读 / 正在检测是否收录...

简介

开发需要获取文件图标并呈现,网上找的大多是使用win32ap的方式获取文件图标,这种方式代码量感觉比较多;而且获取出来的图标不是很清晰。后面发现用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();
        }
    }
}
0

评论 (0)

取消