public ShellNode(ShellBrowser browser, IntPtr pidl, IntPtr shellFolderPtr) { this.Browser = browser; this.shellFolderPtr = shellFolderPtr; this.shellFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(shellFolderPtr, typeof(IShellFolder)); this.SubFiles = new ShellItemCollection(this); this.SubFolders = new ShellItemCollection(this); PIDLRel = new Pidl(pidl, false); Text = "Desktop"; Path = "Desktop"; SetAttributesDesktop(this); ShFileInfo info = new ShFileInfo(); Shell32.SHGetFileInfo(PIDLRel.Ptr, 0, ref info, Marshal.SizeOf(info), SHGFI.Pidl | SHGFI.TypeName | SHGFI.SysIconIndex); Type = info.TypeName; ShellImageList.SetIconIndex(this, info.IconIndex, false); ShellImageList.SetIconIndex(this, info.IconIndex, true); SortFlag = 1; }
static ShellImageList() { ShFileInfo fileInfo = new ShFileInfo(); SmallImageList = Shell32.SHGetFileInfo(".txt", FileAttribute.Normal, ref fileInfo, Marshal.SizeOf(fileInfo), SHGFI.UseFileAttributes | SHGFI.SysIconIndex | SHGFI.SmallIcon); LargeImageList = Shell32.SHGetFileInfo(".txt", FileAttribute.Normal, ref fileInfo, Marshal.SizeOf(fileInfo), SHGFI.UseFileAttributes | SHGFI.SysIconIndex | SHGFI.LargeIcon); }
public int GetImageIndex() { ShFileInfo info = new ShFileInfo(); Shell32.SHGetFileInfo(pidl, 0, ref info, Marshal.SizeOf(info), SHGFI.Pidl | SHGFI.SysIconIndex | SHGFI.OverlayIndex | SHGFI.LargeIcon | SHGFI.AddOverlays | SHGFI.LinkOverlay); Shell32.DestroyIcon(info.IconHandle); return info.IconIndex; }
public static int GetSmallAssociatedIconIndex(string path) { ShFileInfo fileInfo = new ShFileInfo(); Shell32.SHGetFileInfo(path, 0, ref fileInfo, Marshal.SizeOf(fileInfo), SHGFI.SmallIcon | SHGFI.ShellIconSize | SHGFI.SysIconIndex | SHGFI.LinkOverlay); Shell32.DestroyIcon(fileInfo.IconHandle); return fileInfo.IconIndex; }
public static Icon GetLargeAssociatedIcon(string path) { ShFileInfo fileInfo = new ShFileInfo(); Shell32.SHGetFileInfo(path, 0, ref fileInfo, Marshal.SizeOf(fileInfo), SHGFI.LargeIcon | SHGFI.Icon | SHGFI.ShellIconSize); try { if (fileInfo.IconHandle != IntPtr.Zero) { return Icon.FromHandle(fileInfo.IconHandle); } } finally { Shell32.DestroyIcon(fileInfo.IconHandle); } return null; }
private static void SetInfo(ShellNode item) { Pidl pidlFull = item.PIDLFull; ShFileInfo info = new ShFileInfo(); Shell32.SHGetFileInfo(pidlFull.Ptr, 0, ref info, Marshal.SizeOf(info), SHGFI.Pidl | SHGFI.TypeName | SHGFI.SysIconIndex); pidlFull.Free(); ShellImageList.SetIconIndex(item, info.IconIndex, false); ShellImageList.SetIconIndex(item, info.IconIndex, true); item.Type = info.TypeName; }
public static extern IntPtr SHGetFileInfo(string path, FileAttributes fileAttributes, ref ShFileInfo psfi, int fileInfo, SHGFI flags);
public static extern IntPtr SHGetFileInfo(IntPtr ppidl, FileAttribute dwFileAttributes, ref ShFileInfo sfi, int cbFileInfo, SHGFI uFlags);
public static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref ShFileInfo sfi, int cbFileInfo, SHGFI uFlags);
private void Initialize() { IntPtr tempPidl; ShFileInfo info; //My Computer info = new ShFileInfo(); tempPidl = IntPtr.Zero; Shell32.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.Drives, out tempPidl); Shell32.SHGetFileInfo(tempPidl, 0, ref info, Marshal.SizeOf(info), SHGFI.Pidl | SHGFI.DisplayName | SHGFI.TypeName); SystemFolderName = info.TypeName; MyComputerName = info.DisplayName; Marshal.FreeCoTaskMem(tempPidl); // //Dekstop tempPidl = IntPtr.Zero; Shell32.SHGetSpecialFolderLocation(IntPtr.Zero, CSIDL.Desktop, out tempPidl); IntPtr desktopFolderPtr; Shell32.SHGetDesktopFolder(out desktopFolderPtr); DesktopItem = new ShellNode(this, tempPidl, desktopFolderPtr); // //My Documents uint pchEaten = 0; SFGAO pdwAttributes = 0; DesktopItem.ShellFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, SpecialFolderPath.MyDocuments, ref pchEaten, out tempPidl, ref pdwAttributes); info = new ShFileInfo(); Shell32.SHGetFileInfo(tempPidl, 0, ref info, Marshal.SizeOf(info), SHGFI.Pidl | SHGFI.DisplayName); MyDocumentsName = info.DisplayName; Marshal.FreeCoTaskMem(tempPidl); StringBuilder path = new StringBuilder(ShellApi.MaxPath); Shell32.SHGetFolderPath(IntPtr.Zero, CSIDL.Personal, IntPtr.Zero, SHGFP.TypeCurrent, path); MyDocumentsPath = path.ToString(); // }
public static int GetLargeAssociatedIconIndex(string path, FileAttributes attributes) { ShFileInfo fileInfo = new ShFileInfo(); Shell32.SHGetFileInfo(path, attributes, ref fileInfo, Marshal.SizeOf(fileInfo), SHGFI.LargeIcon | SHGFI.SysIconIndex | SHGFI.ShellIconSize | SHGFI.AddOverlays); Shell32.DestroyIcon(fileInfo.IconHandle); return fileInfo.IconIndex; }
public static void SetIconIndex(ShellNode item, int index, bool selectedIcon) { bool hasOverlay = false; int result; // The returned Index SHGFI flag = SHGFI.SysIconIndex | SHGFI.Pidl | SHGFI.Icon; FileAttribute attribute = 0; // build Key into HashTable for this Item int Key = index * 256; if (item.IsLink) { Key = Key | 1; flag = flag | SHGFI.LinkOverlay; hasOverlay = true; } if (item.IsShared) { Key = Key | 2; flag = flag | SHGFI.AddOverlays; hasOverlay = true; } if (selectedIcon) { Key = Key | 4; flag = flag | SHGFI.OpenIcon; hasOverlay = true; // not really an overlay, but handled the same } if (imageTable.ContainsKey(Key)) { result = (int)imageTable[Key]; } else if (!hasOverlay && !item.IsHidden) // for non-overlay icons, we already have { result = (int)System.Math.Floor((double)Key / 256); // the right index -- put in table imageTable[Key] = result; } else // don't have iconindex for an overlay, get it. { if (item.IsFileSystem & !item.IsDisk & !item.IsFolder) { flag = flag | SHGFI.UseFileAttributes; attribute = attribute | FileAttribute.Normal; } Pidl pidl = item.PIDLFull; ShFileInfo smallFileInfo = new ShFileInfo(); Shell32.SHGetFileInfo(pidl.Ptr, attribute, ref smallFileInfo, Marshal.SizeOf(smallFileInfo), flag | SHGFI.SmallIcon); ShFileInfo largeFileInfo = new ShFileInfo(); Shell32.SHGetFileInfo(pidl.Ptr, attribute, ref largeFileInfo, Marshal.SizeOf(largeFileInfo), flag | SHGFI.LargeIcon); Marshal.FreeCoTaskMem(pidl.Ptr); lock (imageTable) { result = ComCtl32.ImageList_ReplaceIcon(SmallImageList, -1, smallFileInfo.IconHandle); ComCtl32.ImageList_ReplaceIcon(LargeImageList, -1, largeFileInfo.IconHandle); } User32.DestroyIcon(smallFileInfo.IconHandle); User32.DestroyIcon(largeFileInfo.IconHandle); imageTable[Key] = result; } if (selectedIcon) { item.SelectedImageIndex = result; } else { item.ImageIndex = result; } }