public IExtractIconPWFlags GetShield() { IExtractIcon iextract = null; IShellFolder ishellfolder = null; StringBuilder str = null; IntPtr result; try { var guid = new Guid("000214fa-0000-0000-c000-000000000046"); uint res = 0; ishellfolder = this.Parent.GetIShellFolder(); var pidls = new IntPtr[1]; pidls[0] = Shell32.ILFindLastID(this.PIDL); ishellfolder.GetUIObjectOf(IntPtr.Zero, 1, pidls, ref guid, res, out result); iextract = (IExtractIcon)Marshal.GetTypedObjectForIUnknown(result, typeof(IExtractIcon)); str = new StringBuilder(512); var index = -1; IExtractIconPWFlags flags; iextract.GetIconLocation(IExtractIconUFlags.GIL_CHECKSHIELD, str, 512, out index, out flags); pidls = null; return(flags); } catch { return(0); } }
public IExtractIconPWFlags GetIconType() { if (this.Extension == ".exe" || this.Extension == ".com" || this.Extension == ".bat" || this.Extension == ".msi") { return(IExtractIconPWFlags.GIL_PERINSTANCE); } if (this.Parent == null) { return(0); } if (this.IsFolder) { IExtractIcon iextract = null; IShellFolder ishellfolder = null; StringBuilder str = null; IntPtr result; try { var guid = new Guid("000214fa-0000-0000-c000-000000000046"); uint res = 0; ishellfolder = this.Parent.GetIShellFolder(); var pidls = new IntPtr[1] { Shell32.ILFindLastID(this.PIDL) }; ishellfolder.GetUIObjectOf(IntPtr.Zero, 1, pidls, ref guid, res, out result); if (result == IntPtr.Zero) { pidls = null; return(IExtractIconPWFlags.GIL_PERCLASS); } iextract = (IExtractIcon)Marshal.GetTypedObjectForIUnknown(result, typeof(IExtractIcon)); str = new StringBuilder(512); var index = -1; IExtractIconPWFlags flags; iextract.GetIconLocation(IExtractIconUFlags.GIL_ASYNC, str, 512, out index, out flags); return(flags); } catch (Exception) { return(0); } } else { return(IExtractIconPWFlags.GIL_PERCLASS); } }
public IExtractIconPWFlags GetIconType() { if (this.IsFolder) { IExtractIcon iextract = null; IShellFolder ishellfolder = null; StringBuilder str = null; IntPtr result; try { var guid = new Guid("000214fa-0000-0000-c000-000000000046"); uint res = 0; ishellfolder = this.Parent.GetIShellFolder(); var pidls = new IntPtr[1] { Shell32.ILFindLastID(this.PIDL) }; ishellfolder.GetUIObjectOf(IntPtr.Zero, 1, pidls, ref guid, res, out result); if (result == IntPtr.Zero) { pidls = null; return(IExtractIconPWFlags.GIL_PERCLASS); } iextract = (IExtractIcon)Marshal.GetTypedObjectForIUnknown(result, typeof(IExtractIcon)); str = new StringBuilder(512); var index = -1; IExtractIconPWFlags flags; iextract.GetIconLocation(0, str, 512, out index, out flags); Marshal.ReleaseComObject(ishellfolder); Marshal.ReleaseComObject(iextract); return(flags); } catch (Exception) { return(0); } } else { var value = this.GetPropertyValue(SystemProperties.PerceivedType, typeof(PerceivedType))?.Value; if (value != null) { var perceivedType = (PerceivedType)value; if (perceivedType == PerceivedType.Application) { return(IExtractIconPWFlags.GIL_PERINSTANCE); } else { return(IExtractIconPWFlags.GIL_PERCLASS); } } } return(IExtractIconPWFlags.GIL_PERCLASS); //if (this.Extension.ToLowerInvariant() == ".exe" || this.Extension.ToLowerInvariant() == ".com" || this.Extension.ToLowerInvariant() == ".bat" || this.Extension.ToLowerInvariant() == ".msi" || this.Extension.ToLowerInvariant() == ".jar") { // return IExtractIconPWFlags.GIL_PERINSTANCE; //} ////return IExtractIconPWFlags.GIL_PERCLASS; //if (this.Parent == null) { // return 0; //} ////if (this.IsFolder) { // IExtractIcon iextract = null; // IShellFolder ishellfolder = null; // StringBuilder str = null; // IntPtr result; // try { // var guid = new Guid("000214fa-0000-0000-c000-000000000046"); // uint res = 0; // ishellfolder = this.Parent.GetIShellFolder(); // var pidls = new IntPtr[1] { Shell32.ILFindLastID(this.PIDL) }; // ishellfolder.GetUIObjectOf(IntPtr.Zero, 1, pidls, ref guid, res, out result); // if (result == IntPtr.Zero) { // pidls = null; // return IExtractIconPWFlags.GIL_PERCLASS; // } // iextract = (IExtractIcon)Marshal.GetTypedObjectForIUnknown(result, typeof(IExtractIcon)); // str = new StringBuilder(512); // var index = -1; // IExtractIconPWFlags flags; // iextract.GetIconLocation(IExtractIconUFlags.GIL_ASYNC, str, 512, out index, out flags); // return flags; // } catch (Exception) { // return 0; // } ////} else { //// return IExtractIconPWFlags.GIL_PERCLASS; ////} }
public Bitmap LoadImageFromExtractIcon(string filename) { if (!System.IO.Directory.Exists(filename) && !System.IO.File.Exists(filename)) { return(null); } Bitmap bm1 = null; IntPtr hbitmap = IntPtr.Zero; IShellFolder desktop = null; IntPtr pidlParent = IntPtr.Zero; IShellFolder shellFolder = null; IUnknown iunk = null; IExtractIcon extractIcon = null; try { Debug.Write("Trying IExtractIcon\r\n"); Shell32.SHGetDesktopFolder(ref desktop); int cParsed = 0; int pdwAttrib = 0; string filePath = filename; if (System.IO.File.Exists(filename)) { filePath = System.IO.Path.GetDirectoryName(filename); } desktop.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, filePath, out cParsed, out pidlParent, out pdwAttrib); Guid uuidShellFolder = new Guid("000214E6-0000-0000-C000-000000000046"); desktop.BindToObject(pidlParent, IntPtr.Zero, ref uuidShellFolder, out shellFolder); Guid uuidExtractIcon = new Guid("000214eb-0000-0000-c000-000000000046"); iunk = GetUIObject(shellFolder, filename, uuidExtractIcon); if (iunk == null) { Debug.Write(" IExtractIcon not supported\r\n"); return(null); } int hres = 0; extractIcon = (IExtractIcon)iunk; StringBuilder location = new StringBuilder(260, 260); int iconIndex = 0; GILFLAGS2 flags = GILFLAGS2.GIL_None; hres = extractIcon.GetIconLocation(0, location, location.Capacity, out iconIndex, out flags); IntPtr iconLarge = IntPtr.Zero; IntPtr iconSmall = IntPtr.Zero; uint iconSize = (16 | (48 << 16)); hres = extractIcon.Extract(location, iconIndex, out iconLarge, out iconSmall, iconSize); Icon ico = Icon.FromHandle(iconLarge); bm1 = ico.ToBitmap(); } catch (Exception e) { Debug.Write(" Exception extracting image from IExtractIcon: " + e.Message + "\r\n"); } finally { if (extractIcon != null) { Marshal.ReleaseComObject(extractIcon); extractIcon = null; } if (iunk != null) { Marshal.ReleaseComObject(iunk); iunk = null; } if (shellFolder != null) { Marshal.ReleaseComObject(shellFolder); shellFolder = null; } if (pidlParent != IntPtr.Zero) { Allocator.Free(pidlParent); pidlParent = IntPtr.Zero; } if (desktop != null) { Marshal.ReleaseComObject(desktop); desktop = null; } if (_allocator != null) { Marshal.ReleaseComObject(_allocator); _allocator = null; } } return(bm1); }
//========================================================== //renvoie la miniature (ou à défaut l'icône) du fichier szFileName //========================================================= //IN szFileName : nom du fichier dont on veut la miniature //IN dwCX : largeur de la miniature //IN dwCY : hauteur de la miniature //IN allowIcon: some videos don't have a true thumbnail. // if true, it will return the icon of the default program used to open this kind of file // (the icon of VLC for example) //renvoie une instance d'image VB IPictureDisp //========================================================== private Bitmap ExtractImage(string szFileName, int dwCX, int dwCY, bool allowIcon = true) { int priority = 0; int requestedColourDepth; int flags; SIZE sz; IntPtr pidl = IntPtr.Zero; IShellFolder isf = null; IExtractImage ie = null; IExtractIcon ii = null; StringBuilder szPath; int pindex = 0; IntPtr pIconLarge = IntPtr.Zero; IntPtr pIconSmall = IntPtr.Zero; SHFILEINFO shgfi = new SHFILEINFO(); Bitmap ret = null; requestedColourDepth = 32; flags = (int)(EIEIFLAG.IEIFLAG_ASPECT | EIEIFLAG.IEIFLAG_OFFLINE | EIEIFLAG.IEIFLAG_SCREEN); //on récupère le nom de fichier sous forme ITEMLIST (pidl) et le dossier parent sous forme IShellFolder isf = GetShellFolder(szFileName, ref pidl); // Try to get the thumbnail ie = getThumbnail(isf, pidl); // If not possible if (ie == null) { // The icon ii = getIcon(isf, pidl); // If possible if (!(ii == null)) { // Extract the icon szPath = new StringBuilder(260); ii.GetIconLocation(0, szPath, 260, ref pindex, ref flags); ii.Extract(szPath.ToString(), pindex, ref pIconLarge, ref pIconSmall, dwCX + 65536 * dwCX); if (pIconLarge == IntPtr.Zero) { SHGetFileInfo(szFileName, 0, ref shgfi, Marshal.SizeOf(shgfi), SHGFIFLAGS.SHGFI_LARGEICON | SHGFIFLAGS.SHGFI_ICON | SHGFIFLAGS.SHGFI_OVERLAYINDEX); ret = Icon.FromHandle(shgfi.hIcon).ToBitmap(); } else { ret = Icon.FromHandle(pIconLarge).ToBitmap(); } } else { SHGetFileInfo(szFileName, 0, ref shgfi, Marshal.SizeOf(shgfi), SHGFIFLAGS.SHGFI_LARGEICON | SHGFIFLAGS.SHGFI_ICON | SHGFIFLAGS.SHGFI_OVERLAYINDEX); ret = Icon.FromHandle(shgfi.hIcon).ToBitmap(); } } else // If possible // Extract the thumbnail with the wanted dimensions { sz.cx = dwCX; sz.cy = dwCY; szPath = new StringBuilder(260); EIEIFLAG f = (EIEIFLAG)flags; int r = ie.GetLocation(szPath, szPath.Capacity, out priority, ref sz, requestedColourDepth, ref f); try { pIconLarge = ie.Extract(); } catch { } // If not possible if (pIconLarge == IntPtr.Zero) { // Retry to get the icon ii = getIcon(isf, pidl); // If possible if (!(ii == null)) { szPath = new StringBuilder(260); ii.GetIconLocation(0, szPath, 260, ref pindex, ref flags); ii.Extract(szPath.ToString(), pindex, ref pIconLarge, ref pIconSmall, dwCX + 65536 * dwCX); if (pIconLarge == IntPtr.Zero) { SHGetFileInfo(szFileName, 0, ref shgfi, Marshal.SizeOf(shgfi), SHGFIFLAGS.SHGFI_LARGEICON | SHGFIFLAGS.SHGFI_ICON); ret = Icon.FromHandle(shgfi.hIcon).ToBitmap(); } else { if (!allowIcon) { return(null); } ret = Icon.FromHandle(pIconLarge).ToBitmap(); } } else { SHGetFileInfo(szFileName, 0, ref shgfi, Marshal.SizeOf(shgfi), SHGFIFLAGS.SHGFI_LARGEICON | SHGFIFLAGS.SHGFI_ICON); ret = Icon.FromHandle(shgfi.hIcon).ToBitmap(); } } else { ret = (Bitmap)Bitmap.FromHbitmap(pIconLarge); } } ILFree(pidl); if (ret == null) { ret.MakeTransparent(); } if (pIconLarge != IntPtr.Zero) { DeleteObject(pIconLarge); } if (pIconSmall != IntPtr.Zero) { DeleteObject(pIconSmall); } if (isf != null) { Marshal.ReleaseComObject(isf); } if (ie != null) { Marshal.ReleaseComObject(ie); } if (ii != null) { Marshal.ReleaseComObject(ii); } return(ret); }