我在弄一个简单资源管理器(类似WINDOWS自带的资源管理器的简化版本)
我想实现一个 取驱动器图标,放在imagelist中
  treeview.imagelist.image.add(MyFile.GetFileIcon(str,true));
MyFile是一个自定义类,GetFileIcon是一个静态方法,用于通过系统API获取驱动器、目录或文件相关联的图标,
str参数用于指定文件路径,true用于指定获取类型是否为大图标.

解决方案 »

  1.   

    导入API的类:using System;
    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);}
    }
      

  2.   

    用TreeView控件实现资源管理器
      

  3.   

    我就是用TREEVIEW来实现的   我现在能够得到驱动器的下名称 ,但怎么获取他们的图标那些不会呀!
      

  4.   

    API是初次接触   我得仔细研究学习下