/// <summary> /// Extract all icons from a file /// </summary> /// <param name="path">File path</param> /// <param name="isLarge">Large (32x32) or Small (16x16) icon</param> /// <returns>Icon[] array</returns> public static Icon[] ExtractIconsFromFile(string path, bool isLarge) { path = Environment.ExpandEnvironmentVariables(path); int iconsCount = (int)GetTotalIcons(path); //checks how many icons. IntPtr[] iconPtr = new IntPtr[iconsCount]; //extracts the icons by the size that was selected. uint readIconCount = isLarge ? Shell32.ExtractIconEx(path, 0, iconPtr, null, iconsCount) : Shell32.ExtractIconEx(path, 0, null, iconPtr, iconsCount); Icon[] iconList = new Icon[iconsCount]; //gets the icons in a list. for (int i = 0; i < iconsCount; i++) { if (iconPtr[i] != IntPtr.Zero) { iconList[i] = GetManagedIcon(iconPtr[i]); } } return(iconList); }
/// <summary> /// Extract the icon from file. /// </summary> /// <param name="path">File path, /// such as ex: "C:\\Program Files\\NetMeeting\\conf.exe,1".</param> /// <param name="isLarge"> /// Determines the returned icon is a large (may be 32x32 px) /// or small icon (16x16 px).</param> public static Icon ExtractIconFromFile(string path, bool isLarge) { IntPtr[] hDummy = new IntPtr[] { IntPtr.Zero }; IntPtr[] hIconEx = new IntPtr[] { IntPtr.Zero }; try { EmbeddedIconInfo embeddedIcon = GetEmbeddedIconInfo(Environment.ExpandEnvironmentVariables(path)); uint readIconCount = isLarge ? Shell32.ExtractIconEx(embeddedIcon.FileName, 0, hIconEx, hDummy, 1) : Shell32.ExtractIconEx(embeddedIcon.FileName, 0, hDummy, hIconEx, 1); if (readIconCount > 0 && hIconEx[0] != IntPtr.Zero) { // Get first icon. return(GetManagedIcon(hIconEx[0])); } else // No icon read { return(null); } } catch (Exception exc) { // Extract icon error. throw new ApplicationException("Could not extract icon", exc); } finally { // Release resources. foreach (IntPtr ptr in hIconEx) { if (ptr != IntPtr.Zero) { User32.DestroyIcon(ptr); } } foreach (IntPtr ptr in hDummy) { if (ptr != IntPtr.Zero) { User32.DestroyIcon(ptr); } } } }
/// <summary> /// Get total icons on a file /// </summary> /// <param name="path">Path to a file</param> /// <example> /// <code>IconReader.GetTotalIcons("C:\\Windows\\system32\\shell32.dll");</code> /// </example> /// <returns>Total icon on selected file</returns> public static uint GetTotalIcons(string path) { return(Shell32.ExtractIconEx(Environment.ExpandEnvironmentVariables(path), -1, null, null, 0)); }