internal ShellItem(ShellBrowser browser, IntPtr pidl, IntPtr shellFolderPtr) { this.browser = browser; this.shellFolderPtr = shellFolderPtr; this.shellFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(shellFolderPtr, typeof(IShellFolder)); subFiles = new ShellItemCollection(this); subFolders = new ShellItemCollection(this); pidlRel = new PIDL(pidl, false); text = "Desktop"; path = "Desktop"; SetAttributesDesktop(this); ShellAPI.SHFILEINFO info = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlRel.Ptr, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.TYPENAME | ShellAPI.SHGFI.SYSICONINDEX); type = info.szTypeName; ShellImageList.SetIconIndex(this, info.iIcon, false); ShellImageList.SetIconIndex(this, info.iIcon, true); sortFlag = 1; }
static ShellImageList() { ShellAPI.SHFILEINFO fileInfo = new ShellAPI.SHFILEINFO(); SmallImageList = ShellAPI.SHGetFileInfo(".txt", ShellAPI.FILE_ATTRIBUTE.NORMAL, ref fileInfo, ShellAPI.cbFileInfo, ShellAPI.SHGFI.USEFILEATTRIBUTES | ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.SMALLICON); LargeImageList = ShellAPI.SHGetFileInfo(".txt", ShellAPI.FILE_ATTRIBUTE.NORMAL, ref fileInfo, ShellAPI.cbFileInfo, ShellAPI.SHGFI.USEFILEATTRIBUTES | ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.LARGEICON); }
public static int GetFileImageIndex(string path, FileAttributes attr) { ShellAPI.SHFILEINFO shfiSmall = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(path, (ShellAPI.FILE_ATTRIBUTE)attr, ref shfiSmall, ShellAPI.cbFileInfo, ShellAPI.SHGFI.USEFILEATTRIBUTES | ShellAPI.SHGFI.SMALLICON | ShellAPI.SHGFI.SYSICONINDEX ); return(shfiSmall.iIcon); }
private void InitVars() { IntPtr tempPidl; ShellAPI.SHFILEINFO info; //My Computer info = new ShellAPI.SHFILEINFO(); tempPidl = IntPtr.Zero; ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellAPI.CSIDL.DRIVES, out tempPidl); ShellAPI.SHGetFileInfo(tempPidl, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.DISPLAYNAME | ShellAPI.SHGFI.TYPENAME); sysfolderName = info.szTypeName; mycompName = info.szDisplayName; Marshal.FreeCoTaskMem(tempPidl); // //Dekstop tempPidl = IntPtr.Zero; ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellAPI.CSIDL.DESKTOP, out tempPidl); IntPtr desktopFolderPtr; ShellAPI.SHGetDesktopFolder(out desktopFolderPtr); desktopItem = new ShellItem(this, tempPidl, desktopFolderPtr); // //My Documents uint pchEaten = 0; ShellAPI.SFGAO pdwAttributes = 0; desktopItem.ShellFolder.ParseDisplayName( IntPtr.Zero, IntPtr.Zero, "::{450d8fba-ad25-11d0-98a8-0800361b1103}", ref pchEaten, out tempPidl, ref pdwAttributes); info = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(tempPidl, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.DISPLAYNAME); mydocsName = info.szDisplayName; Marshal.FreeCoTaskMem(tempPidl); StringBuilder path = new StringBuilder(ShellAPI.MAX_PATH); ShellAPI.SHGetFolderPath( IntPtr.Zero, ShellAPI.CSIDL.PERSONAL, IntPtr.Zero, ShellAPI.SHGFP.TYPE_CURRENT, path); mydocsPath = path.ToString(); // }
static ShellImageList() { imageTable = new Hashtable(); ShellAPI.SHGFI flag = ShellAPI.SHGFI.USEFILEATTRIBUTES | ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.SMALLICON; ShellAPI.SHFILEINFO shfiSmall = new ShellAPI.SHFILEINFO(); smallImageListHandle = ShellAPI.SHGetFileInfo(".txt", ShellAPI.FILE_ATTRIBUTE.NORMAL, ref shfiSmall, ShellAPI.cbFileInfo, flag); flag = ShellAPI.SHGFI.USEFILEATTRIBUTES | ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.LARGEICON; ShellAPI.SHFILEINFO shfiLarge = new ShellAPI.SHFILEINFO(); largeImageListHandle = ShellAPI.SHGetFileInfo(".txt", ShellAPI.FILE_ATTRIBUTE.NORMAL, ref shfiLarge, ShellAPI.cbFileInfo, flag); }
private void InitVars() { IntPtr tempPidl; ShellAPI.SHFILEINFO info; //My Computer info = new ShellAPI.SHFILEINFO(); tempPidl = IntPtr.Zero; ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellAPI.CSIDL.DRIVES, out tempPidl); ShellAPI.SHGetFileInfo(tempPidl, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.DISPLAYNAME | ShellAPI.SHGFI.TYPENAME); sysfolderName = info.szTypeName; mycompName = info.szDisplayName; Marshal.FreeCoTaskMem(tempPidl); // //Dekstop tempPidl = IntPtr.Zero; ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellAPI.CSIDL.DESKTOP, out tempPidl); IntPtr desktopFolderPtr; ShellAPI.SHGetDesktopFolder(out desktopFolderPtr); desktopItem = new ShellItem(this, tempPidl, desktopFolderPtr); // //My Documents uint pchEaten = 0; ShellAPI.SFGAO pdwAttributes = 0; desktopItem.ShellFolder.ParseDisplayName( IntPtr.Zero, IntPtr.Zero, SpecialFolderPath.MyDocuments, ref pchEaten, out tempPidl, ref pdwAttributes); info = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(tempPidl, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.DISPLAYNAME); mydocsName = info.szDisplayName; Marshal.FreeCoTaskMem(tempPidl); StringBuilder path = new StringBuilder(ShellAPI.MAX_PATH); ShellAPI.SHGetFolderPath( IntPtr.Zero, ShellAPI.CSIDL.PERSONAL, IntPtr.Zero, ShellAPI.SHGFP.TYPE_CURRENT, path); mydocsPath = path.ToString(); // }
public static int GetSpecialFolderImageIndex(ShellAPI.CSIDL pidl) { IntPtr tempPidl = IntPtr.Zero; ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, pidl, out tempPidl); ShellAPI.SHFILEINFO shfiSmall = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(tempPidl, 0, ref shfiSmall, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.ICON | ShellAPI.SHGFI.SMALLICON | ShellAPI.SHGFI.SYSICONINDEX ); return(shfiSmall.iIcon); }
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 ShellAPI.SHGFI dwflag = ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.ICON; ShellAPI.FILE_ATTRIBUTE dwAttr = 0; //build Key into HashTable for this Item int Key = index * 256; if (item.IsLink) { Key = Key | 1; dwflag = dwflag | ShellAPI.SHGFI.LINKOVERLAY; HasOverlay = true; } if (item.IsShared) { Key = Key | 2; dwflag = dwflag | ShellAPI.SHGFI.ADDOVERLAYS; HasOverlay = true; } if (SelectedIcon) { Key = Key | 4; dwflag = dwflag | ShellAPI.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 | ShellAPI.SHGFI.USEFILEATTRIBUTES; dwAttr = dwAttr | ShellAPI.FILE_ATTRIBUTE.NORMAL; } PIDL pidlFull = item.PIDLFull; ShellAPI.SHFILEINFO shfiSmall = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiSmall, ShellAPI.cbFileInfo, dwflag | ShellAPI.SHGFI.SMALLICON); ShellAPI.SHFILEINFO shfiLarge = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiLarge, ShellAPI.cbFileInfo, dwflag | ShellAPI.SHGFI.LARGEICON); Marshal.FreeCoTaskMem(pidlFull.Ptr); lock (imageTable) { rVal = ShellAPI.ImageList_ReplaceIcon(smallImageListHandle, -1, shfiSmall.hIcon); ShellAPI.ImageList_ReplaceIcon(largeImageListHandle, -1, shfiLarge.hIcon); } ShellAPI.DestroyIcon(shfiSmall.hIcon); ShellAPI.DestroyIcon(shfiLarge.hIcon); imageTable[Key] = rVal; } if (SelectedIcon) item.SelectedImageIndex = rVal; else item.ImageIndex = rVal; }
public static extern IntPtr SHGetFileInfo(IntPtr ppidl, ShellAPI.FILE_ATTRIBUTE dwFileAttributes, ref ShellAPI.SHFILEINFO sfi, int cbFileInfo, ShellAPI.SHGFI uFlags);
/// <summary> /// This method uses SHGetFileInfo to check whether a path to a directory exists. /// </summary> /// <param name="path">The path to check</param> /// <returns>true if it exists, false otherwise</returns> private bool PathExists(string path) { string realPath = ConvertPath(path); if (string.IsNullOrEmpty(realPath)) return false; else if (string.Compare(path, "desktop", true) == 0) return true; string[] pathParts = realPath.Split('\\'); for (int i = 0; i < pathParts.Length; i++) { bool found = false; if (ShellBrowser.DesktopItem.SubFolders.Contains(pathParts[i])) { pathParts[i] = ShellItem.GetRealPath( ShellBrowser.DesktopItem.SubFolders[pathParts[i]]); found = true; } else { ShellItem myComp = ShellBrowser.DesktopItem.SubFolders[ShellBrowser.MyComputerName]; if (myComp.SubFolders.Contains(pathParts[i])) { pathParts[i] = ShellItem.GetRealPath( myComp.SubFolders[pathParts[i]]); found = true; } } if (!found) break; } realPath = string.Join("\\", pathParts); if (realPath.EndsWith(":")) realPath += "\\"; ShellAPI.SHFILEINFO info = new ShellAPI.SHFILEINFO(); IntPtr ptr = ShellAPI.SHGetFileInfo(realPath, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.DISPLAYNAME); bool exists = (ptr != IntPtr.Zero); Marshal.FreeCoTaskMem(ptr); return exists; }
private static void SetInfo(ShellItem item) { PIDL pidlFull = item.PIDLFull; ShellAPI.SHFILEINFO info = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlFull.Ptr, 0, ref info, ShellAPI.cbFileInfo, ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.TYPENAME | ShellAPI.SHGFI.SYSICONINDEX); pidlFull.Free(); ShellImageList.SetIconIndex(item, info.iIcon, false); ShellImageList.SetIconIndex(item, info.iIcon, true); item.type = info.szTypeName; }
internal static void SetIconIndex(ShellItem item, int index, bool selectedIcon) { bool hasOverlay = false; int result; // The returned Index ShellAPI.SHGFI flag = ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.ICON; ShellAPI.FILE_ATTRIBUTE attribute = 0; // build Key into HashTable for this Item int Key = index * 256; if (item.IsLink) { Key = Key | 1; flag = flag | ShellAPI.SHGFI.LINKOVERLAY; hasOverlay = true; } if (item.IsShared) { Key = Key | 2; flag = flag | ShellAPI.SHGFI.ADDOVERLAYS; hasOverlay = true; } if (selectedIcon) { Key = Key | 4; flag = flag | ShellAPI.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 | ShellAPI.SHGFI.USEFILEATTRIBUTES; attribute = attribute | ShellAPI.FILE_ATTRIBUTE.NORMAL; } PIDL pidl = item.PIDLFull; ShellAPI.SHFILEINFO smallFileInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidl.Ptr, attribute, ref smallFileInfo, ShellAPI.cbFileInfo, flag | ShellAPI.SHGFI.SMALLICON); ShellAPI.SHFILEINFO largeFileInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidl.Ptr, attribute, ref largeFileInfo, ShellAPI.cbFileInfo, flag | ShellAPI.SHGFI.LARGEICON); Marshal.FreeCoTaskMem(pidl.Ptr); lock (imageTable) { result = ShellAPI.ImageList_ReplaceIcon(SmallImageList, -1, smallFileInfo.hIcon); ShellAPI.ImageList_ReplaceIcon(LargeImageList, -1, largeFileInfo.hIcon); } ShellAPI.DestroyIcon(smallFileInfo.hIcon); ShellAPI.DestroyIcon(largeFileInfo.hIcon); imageTable[Key] = result; } if (selectedIcon) { item.SelectedImageIndex = result; } else { item.ImageIndex = result; } }
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 ShellAPI.SHGFI dwflag = ShellAPI.SHGFI.SYSICONINDEX | ShellAPI.SHGFI.PIDL | ShellAPI.SHGFI.ICON; ShellAPI.FILE_ATTRIBUTE dwAttr = 0; //build Key into HashTable for this Item int Key = index * 256; if (item.IsLink) { Key = Key | 1; dwflag = dwflag | ShellAPI.SHGFI.LINKOVERLAY; HasOverlay = true; } if (item.IsShared) { Key = Key | 2; dwflag = dwflag | ShellAPI.SHGFI.ADDOVERLAYS; HasOverlay = true; } if (SelectedIcon) { Key = Key | 4; dwflag = dwflag | ShellAPI.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 | ShellAPI.SHGFI.USEFILEATTRIBUTES; dwAttr = dwAttr | ShellAPI.FILE_ATTRIBUTE.NORMAL; } PIDL pidlFull = item.PIDLFull; ShellAPI.SHFILEINFO shfiSmall = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiSmall, ShellAPI.cbFileInfo, dwflag | ShellAPI.SHGFI.SMALLICON); ShellAPI.SHFILEINFO shfiLarge = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiLarge, ShellAPI.cbFileInfo, dwflag | ShellAPI.SHGFI.LARGEICON); Marshal.FreeCoTaskMem(pidlFull.Ptr); lock (imageTable) { rVal = ShellAPI.ImageList_ReplaceIcon(smallImageListHandle, -1, shfiSmall.hIcon); ShellAPI.ImageList_ReplaceIcon(largeImageListHandle, -1, shfiLarge.hIcon); } ShellAPI.DestroyIcon(shfiSmall.hIcon); ShellAPI.DestroyIcon(shfiLarge.hIcon); imageTable[Key] = rVal; } if (SelectedIcon) { item.SelectedImageIndex = rVal; } else { item.ImageIndex = rVal; } }
public static Bitmap GetFileIcon(string name) { ShellDll.ShellAPI.SHFILEINFO shinfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(name, ShellAPI.FILE_ATTRIBUTE.NORMAL, ref shinfo, (int)Marshal.SizeOf(shinfo), ShellAPI.SHGFI.ICON | ShellAPI.SHGFI.USEFILEATTRIBUTES); return Icon.FromHandle(shinfo.hIcon).ToBitmap(); }