From 1eddae9da670b947ad844a9589f3c74a7252bfb4 Mon Sep 17 00:00:00 2001 From: bao-qian Date: Sat, 20 Aug 2016 13:10:33 +0100 Subject: [PATCH] Remove overlay of shortcut icon again 1. remove GDI dependency 2. remove unused pinvoke define 3. Remove overlay of shortcut icon --- Wox.Infrastructure/Image/ImageLoader.cs | 190 +++++------------------- 1 file changed, 39 insertions(+), 151 deletions(-) diff --git a/Wox.Infrastructure/Image/ImageLoader.cs b/Wox.Infrastructure/Image/ImageLoader.cs index cc16be2107..0743b647d6 100644 --- a/Wox.Infrastructure/Image/ImageLoader.cs +++ b/Wox.Infrastructure/Image/ImageLoader.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -50,15 +48,31 @@ namespace Wox.Infrastructure.Image { try { - Icon icon = GetFileIcon(fileName); - if (icon != null) + // http://blogs.msdn.com/b/oldnewthing/archive/2011/01/27/10120844.aspx + var shfi = new SHFILEINFO(); + var himl = SHGetFileInfo( + fileName, + FILE_ATTRIBUTE_NORMAL, + ref shfi, + (uint)Marshal.SizeOf(shfi), + SHGFI_SYSICONINDEX + ); + + if (himl != IntPtr.Zero) { - var image = ImageFromIcon(icon); - return image; + var hIcon = ImageList_GetIcon(himl, shfi.iIcon, ILD_NORMAL); + // http://stackoverflow.com/questions/1325625/how-do-i-display-a-windows-file-icon-in-wpf + var img = Imaging.CreateBitmapSourceFromHIcon( + hIcon, + Int32Rect.Empty, + BitmapSizeOptions.FromEmptyOptions() + ); + DestroyIcon(hIcon); + return img; } else { - return ImageSources[Constant.ErrorIcon]; + return new BitmapImage(new Uri(Constant.ErrorIcon)); } } catch (System.Exception e) @@ -68,41 +82,11 @@ namespace Wox.Infrastructure.Image } } - private static ImageSource ImageFromIcon(Icon icon) - { - var image = Imaging.CreateBitmapSourceFromHIcon( - icon.Handle, - new Int32Rect(0, 0, icon.Width, icon.Height), - BitmapSizeOptions.FromEmptyOptions()); - return image; - } - - private static ImageSource AssociatedIcon(string path) - { - try - { - Icon icon = Icon.ExtractAssociatedIcon(path); - if (icon != null) - { - var image = ImageFromIcon(icon); - return image; - } - else - { - return ImageSources[Constant.ErrorIcon]; - } - } - catch (System.Exception e) - { - Log.Exception(e); - return ImageSources[Constant.ErrorIcon]; - } - } public static void PreloadImages() { foreach (var icon in new[] { Constant.DefaultIcon, Constant.ErrorIcon }) { - ImageSource img = new BitmapImage(new Uri(Constant.DefaultIcon)); + ImageSource img = new BitmapImage(new Uri(icon)); img.Freeze(); ImageSources[icon] = img; } @@ -138,7 +122,6 @@ namespace Wox.Infrastructure.Image } else { - if (path.StartsWith("data:", StringComparison.OrdinalIgnoreCase)) { image = new BitmapImage(new Uri(path)); @@ -158,7 +141,7 @@ namespace Wox.Infrastructure.Image } else { - image = AssociatedIcon(path); + image = ShellIcon(path); } } else @@ -187,124 +170,29 @@ namespace Wox.Infrastructure.Image return image; } - // http://blogs.msdn.com/b/oldnewthing/archive/2011/01/27/10120844.aspx - private static Icon GetFileIcon(string name) - { - SHFILEINFO shfi = new SHFILEINFO(); - uint flags = SHGFI_SYSICONINDEX; - - IntPtr himl = SHGetFileInfo(name, - FILE_ATTRIBUTE_NORMAL, - ref shfi, - (uint)Marshal.SizeOf(shfi), - flags); - - if (himl != IntPtr.Zero) - { - IntPtr hIcon = ImageList_GetIcon(himl, shfi.iIcon, ILD_NORMAL); - var icon = (Icon)Icon.FromHandle(hIcon).Clone(); - DestroyIcon(hIcon); - return icon; - } - - return null; - } - - [DllImport("comctl32.dll", SetLastError = true)] - private static extern IntPtr ImageList_GetIcon(IntPtr himl, int i, uint flags); - + private const int NAMESIZE = 80; private const int MAX_PATH = 256; - - [StructLayout(LayoutKind.Sequential)] - private struct SHITEMID - { - public ushort cb; - [MarshalAs(UnmanagedType.LPArray)] - public byte[] abID; - } - - [StructLayout(LayoutKind.Sequential)] - private struct ITEMIDLIST - { - public SHITEMID mkid; - } - - [StructLayout(LayoutKind.Sequential)] - private struct BROWSEINFO - { - public IntPtr hwndOwner; - public IntPtr pidlRoot; - public IntPtr pszDisplayName; - [MarshalAs(UnmanagedType.LPTStr)] - public string lpszTitle; - public uint ulFlags; - public IntPtr lpfn; - public int lParam; - public IntPtr iImage; - } - - // Browsing for directory. - private const uint BIF_RETURNONLYFSDIRS = 0x0001; - private const uint BIF_DONTGOBELOWDOMAIN = 0x0002; - private const uint BIF_STATUSTEXT = 0x0004; - private const uint BIF_RETURNFSANCESTORS = 0x0008; - private const uint BIF_EDITBOX = 0x0010; - private const uint BIF_VALIDATE = 0x0020; - private const uint BIF_NEWDIALOGSTYLE = 0x0040; - private const uint BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX); - private const uint BIF_BROWSEINCLUDEURLS = 0x0080; - private const uint BIF_BROWSEFORCOMPUTER = 0x1000; - private const uint BIF_BROWSEFORPRINTER = 0x2000; - private const uint BIF_BROWSEINCLUDEFILES = 0x4000; - private const uint BIF_SHAREABLE = 0x8000; - - [StructLayout(LayoutKind.Sequential)] - private struct SHFILEINFO - { - public const int NAMESIZE = 80; - public IntPtr hIcon; - public int iIcon; - public uint dwAttributes; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] - public string szDisplayName; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)] - public string szTypeName; - } - - private const uint SHGFI_ICON = 0x000000100; // get icon - private const uint SHGFI_DISPLAYNAME = 0x000000200; // get display name - private const uint SHGFI_TYPENAME = 0x000000400; // get type name - private const uint SHGFI_ATTRIBUTES = 0x000000800; // get attributes - private const uint SHGFI_ICONLOCATION = 0x000001000; // get icon location - private const uint SHGFI_EXETYPE = 0x000002000; // return exe type private const uint SHGFI_SYSICONINDEX = 0x000004000; // get system icon index - private const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon - private const uint SHGFI_SELECTED = 0x000010000; // show icon in selected state - private const uint SHGFI_ATTR_SPECIFIED = 0x000020000; // get only specified attributes - private const uint SHGFI_LARGEICON = 0x000000000; // get large icon - private const uint SHGFI_SMALLICON = 0x000000001; // get small icon - private const uint SHGFI_OPENICON = 0x000000002; // get open icon - private const uint SHGFI_SHELLICONSIZE = 0x000000004; // get shell size icon - private const uint SHGFI_PIDL = 0x000000008; // pszPath is a pidl - private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute - private const uint SHGFI_ADDOVERLAYS = 0x000000020; // apply the appropriate overlays - private const uint SHGFI_OVERLAYINDEX = 0x000000040; // Get the index of the overlay - - private const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; private const uint ILD_NORMAL = 0x00000000; - [DllImport("Shell32.dll")] - private static extern IntPtr SHGetFileInfo( - string pszPath, - uint dwFileAttributes, - ref SHFILEINFO psfi, - uint cbFileInfo, - uint uFlags - ); + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct SHFILEINFO + { + readonly IntPtr hIcon; + internal readonly int iIcon; + readonly uint dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] readonly string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)] readonly string szTypeName; + } + + [DllImport("Shell32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); [DllImport("User32.dll")] private static extern int DestroyIcon(IntPtr hIcon); - } + [DllImport("comctl32.dll")] + private static extern IntPtr ImageList_GetIcon(IntPtr himl, int i, uint flags); + } }