/// <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) { SHGetFileInfoConstants dwFlags = SHGetFileInfoConstants.SHGFI_SYSICONINDEX; int dwAttr = 0; if (size == ShellImageListSize.SmallIcons) { dwFlags |= SHGetFileInfoConstants.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 |= SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES; dwAttr = FILE_ATTRIBUTE_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" var shfi = new SHFILEINFO(); var shfiSize = (uint) Marshal.SizeOf(shfi.GetType()); IntPtr retVal = NativeMethods.SHGetFileInfo( fileName, dwAttr, ref shfi, shfiSize, ((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.iIcon; } }
/// <summary> /// Creates the SystemImageList /// </summary> void Create() { // forget last image list if any: hIml = IntPtr.Zero; if (IsXpOrAbove()) { // Get the System IImageList object from the Shell: var iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950"); int ret = NativeMethods.SHGetImageList( (int) size, ref iidImageList, ref iImageList ); if( ret != 0) throw new ShellImageListException("Error getting image list. Return code: {0}, LastWin32Error: {1}", ret, Marshal.GetLastWin32Error()); // 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: var result = NativeMethods.SHGetImageListHandle((int) size, ref iidImageList, ref hIml); if( result != 0 ) throw new ShellImageListException("Error getting image list. Return code: {0}, LastWin32Error: {1}", ret, Marshal.GetLastWin32Error()); } else { // Prepare flags: SHGetFileInfoConstants dwFlags = SHGetFileInfoConstants.SHGFI_USEFILEATTRIBUTES | SHGetFileInfoConstants.SHGFI_SYSICONINDEX; if (size == ShellImageListSize.SmallIcons) { dwFlags |= SHGetFileInfoConstants.SHGFI_SMALLICON; } // Get image list var shfi = new SHFILEINFO(); var shfiSize = (uint) Marshal.SizeOf(shfi.GetType()); // Call SHGetFileInfo to get the image list handle // using an arbitrary file: hIml = NativeMethods.SHGetFileInfo( ".txt", FILE_ATTRIBUTE_NORMAL, ref shfi, shfiSize, (uint) dwFlags); Debug.Assert((hIml != IntPtr.Zero), "Failed to create Image List"); } }
internal static extern IntPtr SHGetFileInfo( string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);