使用API获取Windows系统的文件关联图标

来源:互联网 发布:有故事的淘宝店铺 编辑:程序博客网 时间:2024/06/05 05:38

#region 读取文件图标

        [DllImport("shell32.dll")]

          static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

  

          /// <summary>

          /// 给出文件扩展名(.*),返回相应图标

          /// </summary>

          /// <param name="fileType">文件类型</param>

          /// <param name="isLarge">是否需要大图标,bool</param>

         /// <returns></returns>

         Icon GetIconByFileType(string fileType, bool isLarge)

         {

 

             if (fileType == null || fileType.Equals(string.Empty)) return null;

 

             RegistryKey regVersion = null;

             string regFileType = null;

             string regIconString = null;

             string systemDirectory = Environment.SystemDirectory + "//";

 

             if (fileType[0] == '.')

             {

                 //读系统注册表中文件类型信息

                 regVersion = Registry.ClassesRoot.OpenSubKey(fileType, true);

                 if (regVersion != null)

                 {

                     regFileType = regVersion.GetValue(""as string;

                     regVersion.Close();

                     regVersion = Registry.ClassesRoot.OpenSubKey(regFileType + @"/DefaultIcon"true);

                     if (regVersion != null)

                     {

                         regIconString = regVersion.GetValue(""as string;

                         regVersion.Close();

                     }

                 }

                 if (regIconString == null || regIconString.Length <= 0)

                 {

                     //没有读取到文件类型注册信息,指定为未知文件类型的图标

                     regIconString = systemDirectory + "shell32.dll,0";

                 }

             }

             else

             {

                 //直接指定为文件夹图标

                 regIconString = systemDirectory + "shell32.dll,3";

             }

             string[] fileIcon = regIconString.Split(new char[] { ',' });

             if (fileIcon.Length != 2)

             {

                 //系统注册表中注册的标图不能直接提取,则返回可执行文件的通用图标

                 fileIcon = new string[] { systemDirectory + "shell32.dll""2" };

             }

             Icon resultIcon = null;

             try

             {

                 //调用API方法读取图标

                 int[] phiconLarge = new int[1];

                 int[] phiconSmall = new int[1];

                 uint count = ExtractIconEx(fileIcon[0], Int32.Parse(fileIcon[1]), phiconLarge, phiconSmall, 1);

                 IntPtr IconHnd = new IntPtr(isLarge ? phiconLarge[0] : phiconSmall[0]);

                 resultIcon = Icon.FromHandle(IconHnd);

             }

             catch { }

             return resultIcon;

         }

原创粉丝点击