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