sources/Google.Solutions.Mvvm/Shell/StockIcons.cs (154 lines of code) (raw):

// // Copyright 2022 Google LLC // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. // using System; using System.Drawing; using System.Runtime.InteropServices; namespace Google.Solutions.Mvvm.Shell { public static class StockIcons { /// <summary> /// Icon IDs, see SHSTOCKICONID. /// </summary> public enum IconId { DocNoAssoc = 0, DocAssoc = 1, Application = 2, Folder = 3, Folderopen = 4, Drive525 = 5, Drive35 = 6, DriveRemove = 7, DriveFixed = 8, DriveNet = 9, DriveNetDisabled = 10, DriveCd = 11, DriveRam = 12, World = 13, Server = 15, Printer = 16, MyNetwork = 17, Find = 22, Help = 23, Share = 28, Link = 29, Slowfile = 30, Recycler = 31, RecyclerFull = 32, MediaCdAudio = 40, Lock = 47, Autolist = 49, Printernet = 50, ServerShare = 51, PrinterFax = 52, PrinterFaxnet = 53, PrinterFile = 54, Stack = 55, MediaSvcd = 56, StuffedFolder = 57, DriveUnknown = 58, DriveDvd = 59, MediaDvd = 60, MediaDvdram = 61, MediaDvdrw = 62, MediaDvdr = 63, MediaDvdrom = 64, MediaCdAudioplus = 65, MediaCdrw = 66, MediaCdr = 67, MediaCdburn = 68, MediaBlankcd = 69, MediaCdrom = 70, AudioFiles = 71, ImageFiles = 72, VideoFiles = 73, MixedFiles = 74, FolderBack = 75, FolderFront = 76, Shield = 77, Warning = 78, Info = 79, Error = 80, Key = 81, Software = 82, Rename = 83, Delete = 84, MediaAudiodvd = 85, MediaMoviedvd = 86, MediaEnhancedcd = 87, MediaEnhanceddvd = 88, MediaHddvd = 89, MediaBluray = 90, MediaVcd = 91, MediaDvdplusr = 92, MediaDvdplusrw = 93, DesktoPpc = 94, MobilePc = 95, Users = 96, MediaSmartmedia = 97, MediaCompactFlash = 98, DeviceCellphone = 99, DeviceCamera = 100, DeviceVideoCamera = 101, DeviceAudioPlayer = 102, NetworkConnect = 103, Internet = 104, Zipfile = 105, Settings = 106, DriveHddvd = 132, DriveBd = 133, MediaHddvdrom = 134, MediaHddvdr = 135, MediaHddvdram = 136, MediaBdrom = 137, MediaBdr = 138, MediaBdre = 139, ClusteredDrive = 140 }; public enum IconSize : uint { Large = 0, Small = NativeMethods.SHGFI_SMALLICON } public static Image GetIcon(IconId iconId, IconSize size) { var iconInfo = new NativeMethods.SHSTOCKICONINFO() { cbSize = NativeMethods.SHSTOCKICONINFO.StructSize }; var hr = NativeMethods.SHGetStockIconInfo( iconId, NativeMethods.SHGFI_ICON | (uint)size, ref iconInfo); if (hr != 0) { throw new COMException( $"The stock icon {iconId} could not be loaded", hr); } using (var icon = Icon.FromHandle(iconInfo.hIcon)) { return icon.ToBitmap(); } } //--------------------------------------------------------------------- // P/Invoke declarations. //--------------------------------------------------------------------- private static class NativeMethods { internal const uint SHGFI_ICON = 0x100; internal const uint SHGFI_SMALLICON = 0x1; private const int MAX_PATH = 260; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct SHSTOCKICONINFO { public static uint StructSize = (uint)Marshal.SizeOf<SHSTOCKICONINFO>(); public uint cbSize; public IntPtr hIcon; public int iSysIconIndex; public int iIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] public string szPath; } [DllImport("Shell32.dll", SetLastError = false)] internal static extern int SHGetStockIconInfo( IconId siid, uint uFlags, ref SHSTOCKICONINFO psii); } } }