• C#中读取“已注册的文件类型”的图标及读取指定文件图标的方法 (转)


    using System;
    using System.IO;
    using System.Drawing;
    using Microsoft.Win32;
    using System.Runtime.InteropServices;


    namespace GetIconDemo
    {
      
    /// <summary>
      
    /// 提供从操作系统读取图标的方法
      
    /// </summary>
      public class GetSystemIcon
      {
        
    /// <summary>
        
    /// 依据文件名读取图标,若指定文件不存在,则返回空值。
        
    /// </summary>
        
    /// <param name="fileName"></param>
        
    /// <returns></returns>
        public static Icon GetIconByFileName(string fileName)
        {
            
    if (fileName == null || fileName.Equals(string.Empty)) return null;
            
    if (!File.Exists(fileName)) return null;

            SHFILEINFO shinfo 
    = new SHFILEINFO();
            
    //Use this to get the small Icon
            Win32.SHGetFileInfo(fileName, 0ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
            
    //The icon is returned in the hIcon member of the shinfo struct
            System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
            
    return myIcon;
        }

        
    /// <summary>
        
    /// 给出文件扩展名(.*),返回相应图标
        
    /// 若不以"."开头则返回文件夹的图标。
        
    /// </summary>
        
    /// <param name="fileType"></param>
        
    /// <param name="isLarge"></param>
        
    /// <returns></returns>
        public static 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 = 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 = Win32.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;
        }
      }



      [StructLayout(LayoutKind.Sequential)]
      
    public struct SHFILEINFO
      {
        
    public IntPtr hIcon;
        
    public IntPtr iIcon;
        
    public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
    = 260)]
        
    public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst 
    = 80)]
        
    public string szTypeName;
      };

      
    /// <summary>
      
    /// 定义调用的API方法
      
    /// </summary>
      class Win32
      {
        
    public const uint SHGFI_ICON = 0x100;
        
    public const uint SHGFI_LARGEICON = 0x0// 'Large icon
        public const uint SHGFI_SMALLICON = 0x1// 'Small icon

        [DllImport(
    "shell32.dll")]
        
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
        [DllImport(
    "shell32.dll")]
        
    public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

      }
    }

    实例
    File Explorer.rar
  • 相关阅读:
    洛谷 4035 [JSOI2008]球形空间产生器
    洛谷 2216 [HAOI2007]理想的正方形
    洛谷2704 [NOI2001]炮兵阵地
    洛谷2783 有机化学之神偶尔会做作弊
    洛谷 2233 [HNOI2002]公交车路线
    洛谷2300 合并神犇
    洛谷 1641 [SCOI2010]生成字符串
    Vue history模式支持ie9
    VUE实现登录然后跳转到原来的页面
    vue history模式 apache配置
  • 原文地址:https://www.cnblogs.com/hun_dan/p/1443696.html
Copyright © 2020-2023  润新知