static ShellImageList() { imageTable = new Hashtable(); NativeShellAPI.SHGFI flag = NativeShellAPI.SHGFI.USEFILEATTRIBUTES | NativeShellAPI.SHGFI.SYSICONINDEX | NativeShellAPI.SHGFI.SMALLICON; NativeShellAPI.SHFILEINFO shfiSmall = new NativeShellAPI.SHFILEINFO(); smallImageListHandle = NativeShellAPI.SHGetFileInfo(".txt", NativeShellAPI.FILE_ATTRIBUTE.NORMAL, ref shfiSmall, NativeShellAPI.cbFileInfo, flag); flag = NativeShellAPI.SHGFI.USEFILEATTRIBUTES | NativeShellAPI.SHGFI.SYSICONINDEX | NativeShellAPI.SHGFI.LARGEICON; NativeShellAPI.SHFILEINFO shfiLarge = new NativeShellAPI.SHFILEINFO(); largeImageListHandle = NativeShellAPI.SHGetFileInfo(".txt", NativeShellAPI.FILE_ATTRIBUTE.NORMAL, ref shfiLarge, NativeShellAPI.cbFileInfo, flag); }
internal static void SetIconIndex(ShellItem item, int index, bool SelectedIcon) { bool HasOverlay = false; //true if it's an overlay int rVal = 0; //The returned Index NativeShellAPI.SHGFI dwflag = NativeShellAPI.SHGFI.SYSICONINDEX | NativeShellAPI.SHGFI.PIDL | NativeShellAPI.SHGFI.ICON; NativeShellAPI.FILE_ATTRIBUTE dwAttr = 0; //build Key into HashTable for this Item int Key = index * 256; if (item.IsLink) { Key = Key | 1; dwflag = dwflag | NativeShellAPI.SHGFI.LINKOVERLAY; HasOverlay = true; } if (item.IsShared) { Key = Key | 2; dwflag = dwflag | NativeShellAPI.SHGFI.ADDOVERLAYS; HasOverlay = true; } if (SelectedIcon) { Key = Key | 4; dwflag = dwflag | NativeShellAPI.SHGFI.OPENICON; HasOverlay = true; //not really an overlay, but handled the same } if (imageTable.ContainsKey(Key)) { rVal = (int)imageTable[Key]; } else if (!HasOverlay && !item.IsHidden) //for non-overlay icons, we already have { rVal = (int)System.Math.Floor((double)Key / 256); // the right index -- put in table imageTable[Key] = rVal; } else //don't have iconindex for an overlay, get it. { if (item.IsFileSystem & !item.IsDisk & !item.IsFolder) { dwflag = dwflag | NativeShellAPI.SHGFI.USEFILEATTRIBUTES; dwAttr = dwAttr | NativeShellAPI.FILE_ATTRIBUTE.NORMAL; } PIDL pidlFull = item.PIDLFull; NativeShellAPI.SHFILEINFO shfiSmall = new NativeShellAPI.SHFILEINFO(); NativeShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiSmall, NativeShellAPI.cbFileInfo, dwflag | NativeShellAPI.SHGFI.SMALLICON); NativeShellAPI.SHFILEINFO shfiLarge = new NativeShellAPI.SHFILEINFO(); NativeShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiLarge, NativeShellAPI.cbFileInfo, dwflag | NativeShellAPI.SHGFI.LARGEICON); Marshal.FreeCoTaskMem(pidlFull.Ptr); lock (imageTable) { rVal = NativeShellAPI.ImageList_ReplaceIcon(smallImageListHandle, -1, shfiSmall.hIcon); NativeShellAPI.ImageList_ReplaceIcon(largeImageListHandle, -1, shfiLarge.hIcon); } NativeShellAPI.DestroyIcon(shfiSmall.hIcon); NativeShellAPI.DestroyIcon(shfiLarge.hIcon); imageTable[Key] = rVal; } if (SelectedIcon) { item.SelectedImageIndex = rVal; } else { item.ImageIndex = rVal; } }