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,  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);

  }
}

实例
File Explorer.rar

转载于:https://www.cnblogs.com/hun_dan/archive/2009/04/26/1443696.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值