C#获取系统文件、文件夹和磁盘驱动器图标

最近开发一款软件需要用到获取系统文件的图标,在网上找了一下发现有以下方式获取:

1、调用API的方式获取

    public class SystemIcon
    {
        /// <summary>         
        /// 引用shell32文件的SHGetFileInfo API方法         
         /// </summary>         
        /// <param name="pszPath">指定的文件名,如果为""则返回文件夹的</param>         
        /// <param name="dwFileAttributes">文件属性</param>         
        /// <param name="sfi">返回获得的文件信息,是一个记录类型</param>         
        /// <param name="cbFileInfo">文件的类型名</param>        
        /// <param name="uFlags">文件信息标识</param>         
        /// <returns>-1失败</returns>         
        [DllImport("shell32", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref SHFileInfo sfi, uint cbFileInfo, SHFileInfoFlags uFlags);

        /// <summary>   
        /// 返回系统设置的图标   
         /// </summary>   
        /// <param name="lpszFile">文件名,指定从exe文件或dll文件引入icon</param>   
        /// <param name="nIconIndex">文件的图表中的第几个,指定icon的索引如果为0则从指定的文件中引入第1个icon</param>   
        /// <param name="phiconLarge">返回的大图标的指针,大图标句柄如果为null则为没有大图标</param>   
        /// <param name="phiconSmall">返回的小图标的指针,小图标句柄如果为null则为没有小图标</param>   
        /// <param name="nIcons">ico个数,找几个图标</param>   
        /// <returns></returns
        [DllImport("shell32.dll")]
        public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

        [DllImport("User32.dll", EntryPoint = "DestroyIcon")]
        public static extern int DestroyIcon(IntPtr hIcon);

        /// <summary>         
        /// 文件信息标识枚举类,所有枚举定义值前省略SHGFI投标,比如Icon 完整名称应为SHGFI_ICON         
        /// </summary>         
        [Flags]
        private enum SHFileInfoFlags : uint
        {
            /// <summary>             
            /// 允许有叠加图案的文件图标,该标识必须和Icon同时使用             
             /// </summary>             
            AddOveylays = 0x20,         // SHGFI_AddOverlays = 0x000000020
            /// <summary>             
            /// 只获取由参数FileAttribute指定的文件信息,并将其写入SHFileInfo结构的dwAttributes属性,如果不指定该标识,将同时获取所有文件信息。该标志不能和Icon标识同时使用             
              /// </summary>             
            Attr_Specified = 0x20000,   //  SHGFI_SpecifiedAttributes = 0x000020000
            /// <summary>             
            /// 将获取的文件属性复制到SHFileInfo结构的dwAttributes属性中             
              /// </summary>             
            Attributes = 0x800,     // SHGFI_Attributes = 0x000000800
            /// <summary>             
            /// 获取文件的显示名称(长文件名称),将其复制到SHFileInfo结构的dwAttributes属性中             
              /// </summary>             
            DisplayName = 0x200,    // SHGFI_DisplayName = 0x000000200
            /// <summary>            
            /// 如果文件是可执行文件,将检索其信息,并将信息作为返回值返回              
             /// </summary>             
            ExeType = 0x2000,       // SHGFI_EXEType = 0x000002000
            /// <summary>             
            /// 获得图标和索引,将图标句柄返回到SHFileInfo结构的hIcon属性中,索引返回到iIcon属性中             
             /// </summary>             
            Icon = 0x100,           // SHGFI_Icon = 0x000000100
            /// <summary>             
            /// 检索包含图标的文件,并将文件名,图标句柄,图标索引号,放回到SHFileInfo结构中             
            /// </summary>             
            IconLocation = 0x1000,  // SHGFI_IconLocation = 0x000001000
            /// <summary>             
            /// 获得大图标,该标识必须和Icon标识同时使用             
             /// </summary>             
            LargeIcon = 0x0,        // SHGFI_LargeIcon = 0x000000000
            /// <summary>             
            /// 获取链接覆盖文件图标,该标识必须和Icon标识同时使用。             
             /// </summary>             
            LinkOverlay = 0x8000,   // SHGFI_LinkOverlay = 0x000008000
            /// <summary>             
            /// 获取文件打开时的图标,该标识必须和Icon或SysIconIndex同时使用             
             /// </summary>             
            OpenIcon = 0x2,         //  SHGFI_OpenIcon = 0x000000002
            /// <summary&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值