/// <summary> /// Get system icon for specified folder/file /// </summary> /// <param name="path"> Full path to a folder or file </param> /// <param name="type"> Type: folder or file </param> /// <param name="size"> Icon size: small or large</param> /// <param name="isOpen"> Is open icon (applicable for folders only) </param> /// <returns></returns> public static Icon GetIcon(string path, ItemType type, IconSize size, bool isOpen) { var flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; var attribute = (type == ItemType.Folder) ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_FILE; if (isOpen) flags += SHGFI_OPENICON; if (size == IconSize.Small) flags += SHGFI_SMALLICON; else flags += SHGFI_LARGEICON; var shfi = new SHFileInfo(); var res = SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); if (Equals(res, IntPtr.Zero)) throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); try { Icon.FromHandle(shfi.hIcon); return (Icon)Icon.FromHandle(shfi.hIcon).Clone(); } finally { DestroyIcon(shfi.hIcon); } }
private static readonly uint sizeOfSHFileInfo = (uint)Marshal.SizeOf(typeof(SHFileInfo)); // Size of SHFileInfo struct. #endregion Fields #region Methods /// <summary> /// Gets the icon for a directory or drive. /// </summary> /// <param name="path">The path to the directory or drive.</param> /// <returns>The icon for the directory or drive.</returns> public static Icon GetDirectoryIcon(string path) { SHFileInfo shInfo = new SHFileInfo(); SHGetFileInfo(path, 0, ref shInfo, sizeOfSHFileInfo, SHGFI_ICON | SHGFI_SMALLICON); Icon icon = (Icon)Icon.FromHandle(shInfo.HIcon).Clone(); DestroyIcon(shInfo.HIcon); return icon; }
/// <summary> /// 获取系统文件图标 /// </summary> /// <param name="fileName">文件类型的扩展名或文件的绝对路径,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)</param> /// <param name="isSmallIcon">是否返回小图标</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>返回一个Icon类型的文件图标对象</returns> public static Icon GetFileIcon(string fileName, bool isSmallIcon, out long imageIndex) { imageIndex = ErrorFileIndex; if (String.IsNullOrEmpty(fileName)) { return(null); } SHFileInfo shfi = new SHFileInfo(); SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize; if (isSmallIcon) { uFlags |= SHFileInfoFlags.SmallIcon; } else { uFlags |= SHFileInfoFlags.LargeIcon; } FileInfo fi = new FileInfo(fileName); if (fi.Name.ToUpper().EndsWith(".EXE")) { uFlags |= SHFileInfoFlags.ExeType; } else { uFlags |= SHFileInfoFlags.UseFileAttributes; } int iTotal = (int)SHGetFileInfo(fileName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); //或int iTotal = (int)SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return(icon); }
/// <summary> /// 获取文件类型 /// </summary> /// <param name="path">文件名</param> /// <param name="dwAttr">文件信息</param> /// <param name="dwFlag">信息控制字</param> /// <returns></returns> private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag) { try { SHFileInfo fi = new SHFileInfo(); int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag); if (iTotal > 0) { return(fi.szTypeName); } else { return(""); } } catch { return(""); } }
/* Level One: Calls TDode to add new nodes */ TreeNode GetDirectoryRootNode(string Path) { TreeNode tn = new TreeNode(new DirectoryInfo(Path).Name); SHFileInfo bx = Shell32.StrIco(Path, _sys_lrg); tn.ImageIndex = tn.SelectedImageIndex = (int)bx.iIcon; User32.DestroyIcon(bx.hIcon); bx = new SHFileInfo(); try { foreach (string s in Directory.GetDirectories(Path)) { DirectoryInfo di = new DirectoryInfo(s); tn.Nodes.Add(GetDirectoryNode(s)); } } catch (Exception exception) { Debug.Print("{0}: {1}, File: ‘{2}’", exception, Path, exception.Message); } return(tn); }
public static Icon GetIcon(string path, bool isFile) { var flags = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON); var attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY; var shfi = new SHFileInfo(); var res = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); if (res == IntPtr.Zero) throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); try { Icon.FromHandle(shfi.hIcon); return (Icon)Icon.FromHandle(shfi.hIcon).Clone(); } finally { NativeMethods.DestroyIcon(shfi.hIcon); } }
public int GetIconIndex(IntPtr path) { var options = SHGetFileInfoOptions.SysIconIndex | SHGetFileInfoOptions.Pidl; var shfi = new SHFileInfo(); var shfiSize = Marshal.SizeOf(shfi.GetType()); IntPtr retVal = Win32Api.SHGetFileInfo(path, FileAttributes.None, ref shfi, shfiSize, options); if (shfi.hIcon != IntPtr.Zero) { Win32Api.DestroyIcon(shfi.hIcon); } if (retVal.Equals(IntPtr.Zero)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } else { return(shfi.iIcon); } }
void AddTVPath(string path) { tstb.Text = curpath; DirectoryInfo dii = new DirectoryInfo(path); TreeNode tn1 = new TreeNode(dii.FullName); SHFileInfo bs = Shell32.StrIco(dii.FullName, _sys_ico_lrg); tn1.ImageIndex = tn1.SelectedImageIndex = (int)bs.iIcon; User32.DestroyIcon(bs.hIcon); string [] mantis; try { mantis = Directory.GetDirectories(path); foreach (string jj in mantis) { tn1.Nodes.Add(GetDirectoryNode(jj)); } } catch (Exception exception) { System.Diagnostics.Debug.Print("Error: {0}\n{1}", path, exception.Message); } tv.Nodes.Add(tn1); return; }
public static Icon GetIcon(string path, bool isFile) { var flags = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON); var attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY; var shfi = new SHFileInfo(); var res = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); if (res == IntPtr.Zero) { throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); } try { Icon.FromHandle(shfi.hIcon); return((Icon)Icon.FromHandle(shfi.hIcon).Clone()); } finally { NativeMethods.DestroyIcon(shfi.hIcon); } }
public static Icon GetIcon(string path, DraggedFileType type, IconSize size, ItemState state) { var flags = (uint)(Interop.SHGFI_ICON | Interop.SHGFI_USEFILEATTRIBUTES); var attribute = (uint)(object.Equals(type, DraggedFileType.Folder) ? Interop.FILE_ATTRIBUTE_DIRECTORY : Interop.FILE_ATTRIBUTE_FILE); if (object.Equals(type, DraggedFileType.Folder) && object.Equals(state, ItemState.Open)) { flags += Interop.SHGFI_OPENICON; } if (object.Equals(size, IconSize.Small)) { flags += Interop.SHGFI_SMALLICON; } else { flags += Interop.SHGFI_LARGEICON; } var shfi = new SHFileInfo(); var res = Interop.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); if (object.Equals(res, IntPtr.Zero)) { throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); } try { Icon.FromHandle(shfi.hIcon); return((Icon)Icon.FromHandle(shfi.hIcon).Clone()); } catch { throw; } finally { Interop.DestroyIcon(shfi.hIcon); } }
/// <summary> /// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄 /// </summary> /// <param name="path">文件名或路径名</param> /// <param name="dwAttr">文件信息</param> /// <param name="dwFlag">信息控制字</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>获取到的Icon对象</returns> private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long imageIndex) { if (dwAttr == FileAttribute.Directory) { imageIndex = ErrorFolderIndex; } else { imageIndex = ErrorFileIndex; } SHFileInfo shfi = new SHFileInfo(); int iTotal = (int)SHGetFileInfo(path, dwAttr, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag); //int iTotal = (int)SHGetFileInfo(path, 0, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return(icon); }
/// <summary> /// 获取磁盘驱动器图标 /// </summary> /// <param name="driverMark">有效的磁盘标号,如C、D、I等等,不区分大小写</param> /// <param name="isSmallIcon">标识是获取小图标还是获取大图标</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>返回一个Icon类型的磁盘驱动器图标对象</returns> public static Icon GetDriverIcon(char driverMark, bool isSmallIcon, out long imageIndex) { imageIndex = ErrorDriverIndex; //非有效盘符,返回封装的磁盘图标 if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z') { return(null); } string driverName = driverMark.ToString().ToUpper() + ":\\"; SHFileInfo shfi = new SHFileInfo(); SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize | SHFileInfoFlags.UseFileAttributes; if (isSmallIcon) { uFlags |= SHFileInfoFlags.SmallIcon; } else { uFlags |= SHFileInfoFlags.LargeIcon; } int iTotal = (int)SHGetFileInfo(driverName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); //int iTotal = (int)SHGetFileInfo(driverName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return(icon); }
public static Icon GetIcon(string path, bool isFile) { var flags = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON); var attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY; var shfi = new SHFileInfo(); IntPtr res; try { res = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); } catch (Exception e) { logger.Error(e, $"Unable to call SHGetFileInfo: {e.Message}"); return(null); } if (res == IntPtr.Zero) { logger.Error(Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()), "SHGetFileInfo returned zero"); return(null); } try { return((Icon)Icon.FromHandle(shfi.hIcon).Clone()); } catch (Exception e) { logger.Error(e, $"Failed to call Icon.FromHandle: {e.Message}"); return(null); } finally { NativeMethods.DestroyIcon(shfi.hIcon); } }
private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref SHFileInfo sfi, uint cbFileInfo, SHFileInfoFlags uFlags);
/// <summary> /// 获取文件类型 /// </summary> /// <param name="path">文件名</param> /// <param name="dwAttr">文件信息</param> /// <param name="dwFlag">信息控制字</param> /// <returns></returns> private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag) { try { SHFileInfo fi = new SHFileInfo(); int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag); if (iTotal > 0) { return fi.szTypeName; } else { return ""; } } catch { return ""; } }
public static Icon GetIcon(string path, ItemType type, IconSize size, ItemState state) { var flags = (uint)(Interop.SHGFI_ICON | Interop.SHGFI_USEFILEATTRIBUTES); var attribute = (uint)(object.Equals(type, ItemType.Folder) ? Interop.FILE_ATTRIBUTE_DIRECTORY : Interop.FILE_ATTRIBUTE_FILE); if (object.Equals(type, ItemType.Folder) && object.Equals(state, ItemState.Open)) { flags += Interop.SHGFI_OPENICON; } if (object.Equals(size, IconSize.Small)) { flags += Interop.SHGFI_SMALLICON; } else { flags += Interop.SHGFI_LARGEICON; } var shfi = new SHFileInfo(); var res = Interop.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags); if (object.Equals(res, IntPtr.Zero)) throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); try { Icon.FromHandle(shfi.hIcon); return (Icon)Icon.FromHandle(shfi.hIcon).Clone(); } catch { throw; } finally { Interop.DestroyIcon(shfi.hIcon); } }
static public IntPtr GetImageListPointer(string path, SHGFI flags) { SHFileInfo shinfo = new SHFileInfo(); return(Shell32.SHGetFileInfo(path, 0, ref shinfo, SHFileInfo.struct_size, flags)); }
private static extern IntPtr SHGetFileInfo(IntPtr pidl, uint dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, uint uFlags);
public static IntPtr GetIcon(string FileName) { var icon = IntPtr.Zero; var sfi = new SHFileInfo(); var pidl = SHSimpleIDListFromPath(FileName); if ((pidl != IntPtr.Zero) && (FileName.Substring(0, 3) == "::{")) { SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x1000 | 0x8); // SHGFI_ICONLOCATION | SHGFI_PIDL if (File.Exists(sfi.szDisplayName)) { FileName = sfi.szDisplayName; } } var ext = string.Empty; var i = FileName.LastIndexOf('.'); if (i >= 0) { ext = FileName.Substring(i).ToLower(); } if ((ext == ".exe") || (ext == ".ocx") || (ext == ".dll") || (ext == ".scr") || (ext == ".bin") || (ext == ".cpl")) { IntPtr hModule = LoadLibraryEx(FileName, IntPtr.Zero, 2/*LOAD_LIBRARY_AS_DATAFILE*/); if (hModule != IntPtr.Zero) { if (sfi.iIcon >= 0) { EnumResourceName = string.Empty; EnumResourceIndex = sfi.iIcon; EnumResourceCounter = 0; EnumResourceNames(hModule, 3 + 11/*DIFFERENCE*/, new EnumResNameProcDelegate(EnumResNameProc), IntPtr.Zero); } else { EnumResourceName = string.Format("#{0}", -sfi.iIcon); } icon = GetIcon(hModule, EnumResourceName); FreeLibrary(hModule); } } else if ((ext == ".ico") || (ext == ".icon")) { var iconSize = GetIconSize(FileName); icon = LoadImage(IntPtr.Zero, FileName, 1, iconSize, iconSize, 0x10 | 0x2); // LR_LOADFROMFILE | LR_COLOR } if (icon == IntPtr.Zero) { var osInfo = new OSVersionInfo(); osInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVersionInfo)); GetVersionEx(ref osInfo); var iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); IImageList imageList = null; if ((osInfo.dwMajorVersion >= 6) && (SHGetImageList(4/*SHIL_JUMBO*/, ref iidImageList, ref imageList) >= 0)) { SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000/*SHGFI_SYSICONINDEX*/); imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT if(!AnalizeIcon256(icon)) { DestroyIcon(icon); icon = IntPtr.Zero; } } if ((icon == IntPtr.Zero) && (SHGetImageList(2/*SHIL_EXTRALARGE*/, ref iidImageList, ref imageList) >= 0)) { SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000/*SHGFI_SYSICONINDEX*/); imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT if (icon == (IntPtr)(-1)) { icon = IntPtr.Zero; } } } if ((icon == IntPtr.Zero) && (pidl != IntPtr.Zero) && (SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x100 | 0x0 | 0x8) != IntPtr.Zero)) // SHGFI_ICON | SHGFI_LARGEICON | SHGFI_PIDL { icon = sfi.hIcon; } return icon; }
public static extern IntPtr SHGetFileInfo( string pszPath, [MarshalAs(UnmanagedType.U4)] FileAttributes dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, [MarshalAs(UnmanagedType.U4)] SHFileInfoFlags uFlags);
private static extern Int32 SHGetFileInfo(String path, Int32 fileAttributes, out SHFileInfo fileInfo, UInt32 fileInfoSize, SHGetFileInfoFlags flags);
private static extern int SHGetFileInfoA(string pszPath, int dwFileAttributes, [InAttribute, OutAttribute] SHFileInfo psfi, int cbSizeFileInfo, int uFlags);
/// <summary> /// 获取系统文件夹默认图标 /// </summary> /// <param name="folderName">文件夹名称,如果想获取自定义文件夹图标,请指定完整的文件夹名称(如 F:\test)</param> /// <param name="isSmallIcon">是否返回小图标</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>返回一个Icon类型的文件夹图标对象</returns> public static Icon GetFolderIcon(string folderName, bool isSmallIcon, out long imageIndex) { imageIndex = ErrorFolderIndex; if (String.IsNullOrEmpty(folderName)) return null; SHFileInfo shfi = new SHFileInfo(); SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize | SHFileInfoFlags.UseFileAttributes; if (isSmallIcon) uFlags |= SHFileInfoFlags.SmallIcon; else uFlags |= SHFileInfoFlags.LargeIcon; int iTotal = (int)SHGetFileInfo(folderName, FileAttribute.Directory, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); //或int iTotal = (int)SHGetFileInfo("", 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHFileInfoFlags.Icon | SHFileInfoFlags.SmallIcon); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return icon; }
public static IntPtr ImgListPtr(string path, SHGFI flags) { SHFileInfo shinfo = new SHFileInfo(); return(Shell32.SHGetFileInfo(path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags)); }
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFileInfo psfi, uint cbFileInfo, uint uFlags);
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, uint uFlags);
private void AddFolderFilesList(List <FolderFile_data> list_ff, bool bool_ListFlag, string str_ff, string str_path) { var ffd = new FolderFile_data(); ffd.str_Type = str_ff; ffd.str_FFPath = str_path; if (str_ff.Equals("Directory")) { var di = new DirectoryInfo(str_path); ffd.image_Icon = new BitmapImage(new Uri(@"Images\folder.png", UriKind.Relative)); ffd.str_FFName = di.Name; ffd.long_Size = 0; ffd.str_SizeS = ""; list_ff.Add(ffd); if (bool_ListFlag) { listBox_FolderFiles.Dispatcher.BeginInvoke( new Action(() => { listBox_FolderFiles.ItemsSource = list_ff; })); } } else if ( str_ff.Equals("File")) { var fi = new FileInfo(str_path); if (fi.Extension.ToLower().Equals(".bmp") || fi.Extension.ToLower().Equals(".gif") || fi.Extension.ToLower().Equals(".jpg") || fi.Extension.ToLower().Equals(".jpeg") || fi.Extension.ToLower().Equals(".png") || fi.Extension.ToLower().Equals(".tiff") || fi.Extension.ToLower().Equals(".ico")) { ffd.image_Icon = new BitmapImage(new Uri(fi.FullName)); } else { ffd.image_Icon = SHFileInfo.GetBitmap(fi.FullName); } ffd.str_FFName = fi.Name; ffd.long_Size = fi.Length; ffd.str_SizeS = fi.Length.ToString("###,##0 Byte"); list_ff.Add(ffd); if (bool_ListFlag) { listBox_FolderFiles.Dispatcher.BeginInvoke( new Action(() => { listBox_FolderFiles.ItemsSource = list_ff; })); } } }
private static extern IntPtr SHGetFileInfo(string pszPath, int dwFileAttributes, out SHFileInfo psfi, int cbFileInfo, int uFlags);
/// <summary> /// 获取系统文件图标 /// </summary> /// <param name="fileName">文件类型的扩展名或文件的绝对路径,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)</param> /// <param name="isSmallIcon">是否返回小图标</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>返回一个Icon类型的文件图标对象</returns> public static Icon GetFileIcon(string fileName, bool isSmallIcon, out long imageIndex) { imageIndex = ErrorFileIndex; if (String.IsNullOrEmpty(fileName)) return null; SHFileInfo shfi = new SHFileInfo(); SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize; if (isSmallIcon) uFlags |= SHFileInfoFlags.SmallIcon; else uFlags |= SHFileInfoFlags.LargeIcon; FileInfo fi = new FileInfo(fileName); if (fi.Name.ToUpper().EndsWith(".EXE")) uFlags |= SHFileInfoFlags.ExeType; else uFlags |= SHFileInfoFlags.UseFileAttributes; int iTotal = (int)SHGetFileInfo(fileName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return icon; }
public static IntPtr GetIcon(string FileName) { var icon = IntPtr.Zero; var sfi = new SHFileInfo(); var pidl = SHSimpleIDListFromPath(FileName); if ((pidl != IntPtr.Zero) && (FileName.Substring(0, 3) == "::{")) { SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x1000 | 0x8); // SHGFI_ICONLOCATION | SHGFI_PIDL if (File.Exists(sfi.szDisplayName)) { FileName = sfi.szDisplayName; } } var ext = string.Empty; var i = FileName.LastIndexOf('.'); if (i >= 0) { ext = FileName.Substring(i).ToLower(); } if ((ext == ".exe") || (ext == ".ocx") || (ext == ".dll") || (ext == ".scr") || (ext == ".bin") || (ext == ".cpl")) { IntPtr hModule = LoadLibraryEx(FileName, IntPtr.Zero, 2 /*LOAD_LIBRARY_AS_DATAFILE*/); if (hModule != IntPtr.Zero) { if (sfi.iIcon >= 0) { EnumResourceName = string.Empty; EnumResourceIndex = sfi.iIcon; EnumResourceCounter = 0; EnumResourceNames(hModule, 3 + 11 /*DIFFERENCE*/, new EnumResNameProcDelegate(EnumResNameProc), IntPtr.Zero); } else { EnumResourceName = string.Format("#{0}", -sfi.iIcon); } icon = GetIcon(hModule, EnumResourceName); FreeLibrary(hModule); } } else if ((ext == ".ico") || (ext == ".icon")) { var iconSize = GetIconSize(FileName); icon = LoadImage(IntPtr.Zero, FileName, 1, iconSize, iconSize, 0x10 | 0x2); // LR_LOADFROMFILE | LR_COLOR } if (icon == IntPtr.Zero) { var osInfo = new OSVersionInfo(); osInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVersionInfo)); GetVersionEx(ref osInfo); var iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); IImageList imageList = null; if ((osInfo.dwMajorVersion >= 6) && (SHGetImageList(4 /*SHIL_JUMBO*/, ref iidImageList, ref imageList) >= 0)) { SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000 /*SHGFI_SYSICONINDEX*/); imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT if (!AnalizeIcon256(icon)) { DestroyIcon(icon); icon = IntPtr.Zero; } } if ((icon == IntPtr.Zero) && (SHGetImageList(2 /*SHIL_EXTRALARGE*/, ref iidImageList, ref imageList) >= 0)) { SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000 /*SHGFI_SYSICONINDEX*/); imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT if (icon == (IntPtr)(-1)) { icon = IntPtr.Zero; } } } if ((icon == IntPtr.Zero) && (pidl != IntPtr.Zero) && (SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x100 | 0x0 | 0x8) != IntPtr.Zero)) // SHGFI_ICON | SHGFI_LARGEICON | SHGFI_PIDL { icon = sfi.hIcon; } return(icon); }
/// <summary> /// 获取磁盘驱动器图标 /// </summary> /// <param name="driverMark">有效的磁盘标号,如C、D、I等等,不区分大小写</param> /// <param name="isSmallIcon">标识是获取小图标还是获取大图标</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>返回一个Icon类型的磁盘驱动器图标对象</returns> public static Icon GetDriverIcon(char driverMark, bool isSmallIcon, out long imageIndex) { imageIndex = ErrorDriverIndex; //非有效盘符,返回封装的磁盘图标 if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z') { return null; } string driverName = driverMark.ToString().ToUpper() + ":\\"; SHFileInfo shfi = new SHFileInfo(); SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize | SHFileInfoFlags.UseFileAttributes; if (isSmallIcon) uFlags |= SHFileInfoFlags.SmallIcon; else uFlags |= SHFileInfoFlags.LargeIcon; int iTotal = (int)SHGetFileInfo(driverName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); //int iTotal = (int)SHGetFileInfo(driverName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return icon; }
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, uint cbSizeFileInfo, uint uFlags);
/// <summary> /// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄 /// </summary> /// <param name="path">文件名或路径名</param> /// <param name="dwAttr">文件信息</param> /// <param name="dwFlag">信息控制字</param> /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param> /// <returns>获取到的Icon对象</returns> private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long imageIndex) { if (dwAttr == FileAttribute.Directory) { imageIndex = ErrorFolderIndex; } else { imageIndex = ErrorFileIndex; } SHFileInfo shfi = new SHFileInfo(); int iTotal = (int)SHGetFileInfo(path, dwAttr, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag); //int iTotal = (int)SHGetFileInfo(path, 0, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag); Icon icon = null; if (iTotal > 0) { icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon; imageIndex = shfi.iIcon.ToInt64(); } DestroyIcon(shfi.hIcon); //释放资源 return icon; }
public static extern IntPtr SHGetFileInfo(string path, uint fileAttributes, ref SHFileInfo fileInfo, int fileInfoSize, uint flags);
[DllImport(shell32)] static public extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, uint cbSizeFileInfo, SHGFI uFlags);