|
|
C#获取文件图标 |
|
|
原作者不详
一点不足,文件夹图标是从shell32.dll中得到的.一般情况下是没有问题的.但是当文件夹的图片时自定义的时候就无法得到了.继续研究中
using System; using System.IO; using System.Drawing; using Microsoft.Win32;
using System.Runtime.InteropServices;
namespace Allinhands.Common { /// /// 提供从操作系统读取图标的方法 /// public class GetSystemIcon { /// /// 依据文件名读取图标,若指定文件不存在,则返回空值。 /// /// /// public 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; }
/// /// 给出文件扩展名(.*),返回相应图标 /// 若不以"."开头则返回文件夹的图标。 /// /// /// /// public 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; };
/// /// 定义调用的API方法 /// 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);
} }
缺缺 发表于 2005-5-7 [所属栏目: .Net | 返回首页]
|
|
|