/// <summary> /// Creates the SystemImageList /// </summary> private void create() { // forget last image list if any: hIml = IntPtr.Zero; if (isXpOrAbove()) { // Get the System IImageList object from the Shell: Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); int ret = Shell32.SHGetImageList((int)size, ref iidImageList, ref iImageList); // the image list handle is the IUnknown pointer, but // using Marshal.GetIUnknownForObject doesn't return // the right value. It really doesn't hurt to make // a second call to get the handle: Shell32.SHGetImageListHandle((int)size, ref iidImageList, ref hIml); } else { // Prepare flags: SHGFI dwFlags = SHGFI.UseFileAttributes | SHGFI.SysIconIndex; if (size == SysImageListSize.smallIcons) { dwFlags |= SHGFI.SmallIcon; } // Get image list ShFileInfo shfi = new ShFileInfo(); uint shfiSize = (uint)Marshal.SizeOf(shfi.GetType()); // Call SHGetFileInfo to get the image list handle // using an arbitrary file: hIml = Shell32.SHGetFileInfo(".txt", FileAttributes.Normal, ref shfi, (int)shfiSize, dwFlags); System.Diagnostics.Debug.Assert((hIml != IntPtr.Zero), "Failed to create Image List"); } }
/// <summary> /// Returns the index of the icon for the specified file /// </summary> /// <param name="fileName">Filename to get icon for</param> /// <param name="forceLoadFromDisk">If True, then hit the disk to get the icon, /// otherwise only hit the disk if no cached icon is available.</param> /// <param name="iconState">Flags specifying the state of the icon /// returned.</param> /// <returns>Index of the icon</returns> public int IconIndex(string fileName, bool forceLoadFromDisk, ShellIconStateConstants iconState) { SHGFI dwFlags = SHGFI.SysIconIndex; FileAttributes dwAttr; if (size == SysImageListSize.smallIcons) { dwFlags |= SHGFI.SmallIcon; } // We can choose whether to access the disk or not. If you don't // hit the disk, you may get the wrong icon if the icon is // not cached. Also only works for files. if (!forceLoadFromDisk) { dwFlags |= SHGFI.UseFileAttributes; dwAttr = FileAttributes.Normal; } else { dwAttr = 0; } // sFileSpec can be any file. You can specify a // file that does not exist and still get the // icon, for example sFileSpec = "C:\PANTS.DOC" ShFileInfo shfi = new ShFileInfo(); uint shfiSize = (uint)Marshal.SizeOf(shfi.GetType()); IntPtr retVal = Shell32.SHGetFileInfo(fileName, dwAttr, ref shfi, (int)shfiSize, (SHGFI)((uint)(dwFlags) | (uint)iconState)); if (retVal.Equals(IntPtr.Zero)) { System.Diagnostics.Debug.Assert((!retVal.Equals(IntPtr.Zero)), "Failed to get icon index"); return 0; } else { return shfi.IconIndex; } }