53 lines
1.7 KiB
C#
53 lines
1.7 KiB
C#
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;
|
|
}
|
|
}
|