public static ImageSource GetStockIconImage(ShStockIconId iconId, bool large, bool getSystemIcon) { BitmapSource imageSource; if (Environment.OSVersion.Version.Major >= 6 && !getSystemIcon) { var sii = new ShStockIconInfo { cbSize = (UInt32)Marshal.SizeOf(typeof(ShStockIconInfo)) }; int errCode = Shell32.SHGetStockIconInfo(iconId, ShGSI.SHGSI_ICON | (large ? ShGSI.SHGSI_LARGEICON : ShGSI.SHGSI_SMALLICON) | ShGSI.SHGSI_SHELLICONSIZE, ref sii); Marshal.ThrowExceptionForHR(errCode); imageSource = Imaging.CreateBitmapSourceFromHIcon(sii.hIcon, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); User32.DestroyIcon(sii.hIcon); } else { Icon icon; switch (iconId) { case ShStockIconId.SIID_APPLICATION: icon = SystemIcons.Application; break; case ShStockIconId.SIID_HELP: icon = SystemIcons.Question; break; case ShStockIconId.SIID_ERROR: icon = SystemIcons.Error; break; case ShStockIconId.SIID_INFO: icon = SystemIcons.Information; break; case ShStockIconId.SIID_WARNING: icon = SystemIcons.Warning; break; case ShStockIconId.SIID_SHIELD: icon = SystemIcons.Shield; break; default: throw new ArgumentException($@"No system icon available for {iconId}", nameof(iconId)); } imageSource = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } return(imageSource); }
private static BitmapSource GetWindowsIcon(WindowsIconKey icon) { if (icons.TryGetValue(icon, out var source)) { return(source); } var info = new ShStockIconInfo(); info.cbSize = (uint)Marshal.SizeOf(info); SHGetStockIconInfo(icon.Type, SHGSI_ICON | icon.Size, ref info); // var bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(info.hIcon, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); using var iconDrawing = Icon.FromHandle(info.hIcon); using var bitmap = iconDrawing.ToBitmap(); var hBitmap = bitmap.GetHbitmap(); try { BitmapSizeOptions size; switch (icon.Size) { case SHGSI_SMALLICON: size = BitmapSizeOptions.FromWidthAndHeight(16, 16); break; default: size = BitmapSizeOptions.FromWidthAndHeight(32, 32); break; } var wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( hBitmap, IntPtr.Zero, Int32Rect.Empty, size); wpfBitmap.Freeze(); icons[icon] = wpfBitmap; return(wpfBitmap); } finally { DeleteObject(hBitmap); DestroyIcon(info.hIcon); } }
internal static extern Int32 SHGetStockIconInfo(ShStockIconId siid, ShGSI uFlags, ref ShStockIconInfo psii);
private static extern int SHGetStockIconInfo(uint siid, uint uFlags, ref ShStockIconInfo psii);