/// <summary> /// Constructor. Creates the ShellItem object for the Desktop. /// </summary> public ShellItem() { // Obtain the root IShellFolder interface. int hRes = ShellAPI.SHGetDesktopFolder(ref m_shRootShell); if (hRes != 0) Marshal.ThrowExceptionForHR(hRes); // Now get the PIDL for the Desktop shell item. hRes = ShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, ShellAPI.CSIDL.CSIDL_DESKTOP, ref m_pIDL); if (hRes != 0) Marshal.ThrowExceptionForHR(hRes); // Now retrieve some attributes for the root shell item. ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGetFileInfo(m_pIDL, 0, out shInfo, (uint)Marshal.SizeOf(shInfo), ShellAPI.SHGFI.SHGFI_DISPLAYNAME | ShellAPI.SHGFI.SHGFI_PIDL | ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX ); // Set the arributes to object properties. DisplayName = shInfo.szDisplayName; IconIndex = shInfo.iIcon; IsFolder = true; HasSubFolder = true; Path = GetPath(); // Internal with no set{} mutator. m_shShellFolder = RootShellFolder; m_bHaveRootShell = true; }
/// <summary> /// Retrieves the handle of the system image list. /// </summary> private static void InitImageList() { // Retrieve the info for a fake file so we can get the image list handle. ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGFI dwAttribs = ShellAPI.SHGFI.SHGFI_USEFILEATTRIBUTES | ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX; m_pImgHandle = ShellAPI.SHGetFileInfo(".txt", ShellAPI.FILE_ATTRIBUTE_NORMAL, out shInfo, (uint)Marshal.SizeOf(shInfo), dwAttribs); // Make sure we got the handle. if (m_pImgHandle.Equals(IntPtr.Zero)) throw new Exception("Unable to retrieve system image list handle."); }
/// <summary> /// Constructor. Create a sub-item shell item object. /// </summary> /// <param name="shDesktop">IShellFolder interface of the Desktop</param> /// <param name="pIDL">The fully qualified PIDL for this shell item</param> /// <param name="shParent">The ShellItem object for this item's parent</param> public ShellItem(ShellAPI.IShellFolder shDesktop, IntPtr pIDL, ShellItem shParent) { // We need the Desktop shell item to exist first. if (m_bHaveRootShell == false) throw new Exception("The root shell item must be created before creating a sub-item"); // Create the FQ PIDL for this new item. m_pIDL = ShellAPI.ILCombine(shParent.PIDL, pIDL); // Get the properties of this item. ShellAPI.SFGAOF uFlags = ShellAPI.SFGAOF.SFGAO_FOLDER | ShellAPI.SFGAOF.SFGAO_HASSUBFOLDER; // Here we get some basic attributes. shDesktop.GetAttributesOf(1, out m_pIDL, out uFlags); IsFolder = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FOLDER); HasSubFolder = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_HASSUBFOLDER); // Now we want to get extended attributes such as the icon index etc. ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGFI vFlags = ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX | ShellAPI.SHGFI.SHGFI_PIDL | ShellAPI.SHGFI.SHGFI_DISPLAYNAME; ShellAPI.SHGetFileInfo(m_pIDL, 0, out shInfo, (uint)Marshal.SizeOf(shInfo), vFlags); DisplayName = shInfo.szDisplayName; IconIndex = shInfo.iIcon; Path = GetPath(); // Create the IShellFolder interface for this item. if (IsFolder) { uint hRes = shParent.m_shShellFolder.BindToObject(pIDL, IntPtr.Zero, ref ShellAPI.IID_IShellFolder, out m_shShellFolder); if (hRes != 0) Marshal.ThrowExceptionForHR((int)hRes); } }