根据扩展名, 从注册表中取得文件的图标

好久没上传文章了,因为太忙!在网上得到过无数程序人的帮助,希望我的文章也能帮助一些象我一样的程序人!

        最近在写一个嵌入的文档版本管理软件,要用到系统文件图标,上网找了许久,竟没找到一个合适的解决方法,只好自已动手写了。在写这个东西的过程中,得到了以下文章的启发,在些向文章的作者表示万份感谢!

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-vb/22674/Icons-in-DLL-s

http://www.z4.cn/bbs/showthread.php?threadid=1794

 

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


using System.Runtime.InteropServices;

 

namespace Deep.DBFile.DataCommunicate
{
 /// <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, 0, ref 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);

 }
}

 

原作: saswp
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=334421

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值