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
posted @ 2009-04-26 00:30  王大湿  阅读(859)  评论(0编辑  收藏  举报