using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace GeekDesk.Util { public static class DefaultIcons { private static Icon folderIcon; public static Icon FolderLarge => folderIcon ?? (folderIcon = GetStockIcon(SHGSI_ICON, SHGSI_LARGEICON)); public static Icon GetStockIcon(uint type, uint size) { var info = new SHSTOCKICONINFO(); info.cbSize = (uint)Marshal.SizeOf(info); SHGetStockIconInfo(type, SHGSI_ICON | size, ref info); var icon = (Icon)Icon.FromHandle(info.hIcon).Clone(); // Get a copy that doesn't use the original handle DestroyIcon(info.hIcon); // Clean up native icon to prevent resource leak return icon; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHSTOCKICONINFO { public uint cbSize; public IntPtr hIcon; public int iSysIconIndex; public int iIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szPath; } [DllImport("shell32.dll")] public static extern int SHGetStockIconInfo(uint siid, uint uFlags, ref SHSTOCKICONINFO psii); [DllImport("user32.dll")] public static extern bool DestroyIcon(IntPtr handle); public static uint SHSIID_FOLDER = 0x3; public static uint SHGSI_ICON = 0x100; public static uint SHGSI_LARGEICON = 0x0; public static uint SHGSI_SMALLICON = 0x1; } }