程序代码
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 ) ;
}
}
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 ) ;
}
}