我在弄一个简单资源管理器(类似WINDOWS自带的资源管理器的简化版本)
我想实现一个 取驱动器图标,放在imagelist中
treeview.imagelist.image.add(MyFile.GetFileIcon(str,true));
MyFile是一个自定义类,GetFileIcon是一个静态方法,用于通过系统API获取驱动器、目录或文件相关联的图标,
str参数用于指定文件路径,true用于指定获取类型是否为大图标.
我想实现一个 取驱动器图标,放在imagelist中
treeview.imagelist.image.add(MyFile.GetFileIcon(str,true));
MyFile是一个自定义类,GetFileIcon是一个静态方法,用于通过系统API获取驱动器、目录或文件相关联的图标,
str参数用于指定文件路径,true用于指定获取类型是否为大图标.
using System.Runtime.InteropServices;namespace MediaClient
...{
public class Win32
...{
[DllImport("shell32.dll", EntryPoint = "ExtractIcon")]
public static extern int ExtractIcon(IntPtr hInst,string lpFileName,int nIndex); [DllImport("shell32.dll", EntryPoint = "SHGetFileInfo")]
public static extern IntPtr SHGetFileInfo(string pszPath,uint dwFileAttribute,ref SHFILEINFO psfi,uint cbSizeFileInfo,uint Flags); [DllImport("User32.dll", EntryPoint = "DestroyIcon")]
public static extern int DestroyIcon(IntPtr hIcon); [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>
/// 获得指定路径下面的所有文件及文件夹
/// </summary>
/// <param name="path">路径</param>
/// <returns></returns>
public ArrayList GetListViewItem(string path,ImageList imglist)
...{
Win32.SHFILEINFO shfi = new Win32.SHFILEINFO();
try
...{
string[] dirs = Directory.GetDirectories(path);
string[] files = Directory.GetFiles(path);
ArrayList itemarr = new ArrayList(); for (int i = 0; i < dirs.Length; i++)
...{
string[] info = new string[4];
DirectoryInfo dir = new DirectoryInfo(dirs[i]);
//获得图标
Win32.SHGetFileInfo(dirs[i],
(uint)0x80,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
(uint)(0x100 | 0x400)); //取得Icon和TypeName
//添加图标
imglist.Images.Add(dir.Name, (Icon)Icon.FromHandle(shfi.hIcon).Clone());
info[0] = dir.Name;
info[1] = "";
info[2] = "文件夹";
info[3] = dir.LastWriteTime.ToString();
ListViewItem item = new ListViewItem(info,dir.Name);
itemarr.Add(item);
//销毁图标
Win32.DestroyIcon(shfi.hIcon);
}
for (int i = 0; i < files.Length; i++)
...{
string[] info = new string[4];
FileInfo fi = new FileInfo(files[i]);
//获得图标
Win32.SHGetFileInfo(files[i],
(uint)0x80,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
(uint)(0x100 | 0x400)); //取得Icon和TypeName
//添加图标
imglist.Images.Add(fi.Name,(Icon)Icon.FromHandle(shfi.hIcon).Clone());
info[0] = fi.Name;
info[1] = fi.Length.ToString();
info[2] = fi.Extension.ToString();
info[3] = fi.LastWriteTime.ToString();
ListViewItem item = new ListViewItem(info,fi.Name);
itemarr.Add(item);
//销毁图标
Win32.DestroyIcon(shfi.hIcon);
}
return itemarr;
}
catch
...{
return null;
}
}
uFlags常数:
SHGFI_ICON = 0x100
SHGFI_DISPLAYNAME = 0x200,
SHGFI_TYPENAME = 0x400,
SHGFI_ATTRIBUTES = 0x800,
SHGFI_ICONLOCATION = 0x1000,
SHGFI_EXETYPE = 0x2000,
SHGFI_SYSICONINDEX = 0x4000,
SHGFI_LINKOVERLAY = 0x8000,
SHGFI_SELECTED = 0x10000,
SHGFI_ATTR_SPECIFIED = 0x20000,
SHGFI_LARGEICON = 0x0,
SHGFI_SMALLICON = 0x1,
SHGFI_OPENICON = 0x2,
SHGFI_SHELLICONSIZE = 0x4,
SHGFI_PIDL = 0x8,
SHGFI_USEFILEATTRIBUTES = 0x10C#获取文件图标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);}
}