| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Drawing;
 
- using System.Drawing.Imaging;
 
- using System.IO;
 
- using System.Runtime.InteropServices;
 
- using System.Windows.Media.Imaging;
 
- namespace GeekDesk.Util
 
- {
 
-     public class FileIcon
 
-     {
 
-         private static List<string> GetBlurExts()
 
-         {
 
-             List<string> list = new List<string>();
 
-             list.Add(".exe");
 
-             list.Add(".cer");
 
-             list.Add(".lnk");
 
-             return list;
 
-         }
 
-         [DllImport("User32.dll")]
 
-         public static extern int PrivateExtractIcons(
 
-            string lpszFile, //文件名可以是exe,dll,ico,cur,ani,bmp
 
-            int nIconIndex,  //从第几个图标开始获取
 
-            int cxIcon,      //获取图标的尺寸x
 
-            int cyIcon,      //获取图标的尺寸y
 
-            IntPtr[] phicon, //获取到的图标指针数组
 
-            int[] piconid,   //图标对应的资源编号
 
-            int nIcons,      //指定获取的图标数量,仅当文件类型为.exe 和 .dll时候可用
 
-            int flags        //标志,默认0就可以,具体可以看LoadImage函数
 
-        );
 
-         public static BitmapImage GetBitmapImage(string filePath)
 
-         {
 
-             Icon ico;
 
-             //选中文件中的图标总数
 
-             var iconTotalCount = PrivateExtractIcons(filePath, 0, 0, 0, null, null, 0, 0);
 
-             //用于接收获取到的图标指针
 
-             IntPtr[] hIcons = new IntPtr[iconTotalCount];
 
-             //对应的图标id
 
-             int[] ids = new int[iconTotalCount];
 
-             //成功获取到的图标个数
 
-             var successCount = PrivateExtractIcons(filePath, 0, 256, 256, hIcons, ids, iconTotalCount, 0);
 
-             string ext = Path.GetExtension(filePath).ToLower();
 
-             IntPtr ip = IntPtr.Zero;
 
-             if (successCount > 0)
 
-             {
 
-                 ip = hIcons[0];
 
-                 ico = Icon.FromHandle(ip);
 
-             }
 
-             else if (GetBlurExts().Contains(ext))
 
-             {
 
-                 ico = Icon.ExtractAssociatedIcon(filePath);
 
-             }
 
-             else
 
-             {
 
-                 ip = GetJumboIcon(GetIconIndex(filePath));
 
-                 ico = Icon.FromHandle(ip);
 
-             }
 
-             Bitmap bmp = ico.ToBitmap();
 
-             MemoryStream strm = new MemoryStream();
 
-             ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/png");
 
-             Encoder myEncoder = Encoder.Quality;
 
-             EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 75L);
 
-             EncoderParameters myEncoderParameters = new EncoderParameters(1);
 
-             myEncoderParameters.Param[0] = myEncoderParameter;
 
-             bmp.Save(strm, myImageCodecInfo, myEncoderParameters);
 
-             BitmapImage bmpImage = new BitmapImage();
 
-             bmpImage.BeginInit();
 
-             strm.Seek(0, SeekOrigin.Begin);
 
-             bmpImage.StreamSource = strm;
 
-             bmpImage.EndInit();
 
-             if (ip != IntPtr.Zero)
 
-             {
 
-                 Shell32.DestroyIcon(ip);
 
-             }
 
-             return bmpImage.Clone();
 
-         }
 
-         private static ImageCodecInfo GetEncoderInfo(String mimeType)
 
-         {
 
-             int j;
 
-             ImageCodecInfo[] encoders;
 
-             encoders = ImageCodecInfo.GetImageEncoders();
 
-             for (j = 0; j < encoders.Length; ++j)
 
-             {
 
-                 if (encoders[j].MimeType == mimeType)
 
-                     return encoders[j];
 
-             }
 
-             return null;
 
-         }
 
-         public static int GetIconIndex(string pszFile)
 
-         {
 
-             SHFILEINFO sfi = new SHFILEINFO();
 
-             Shell32.SHGetFileInfo(pszFile
 
-                 , 0
 
-                 , ref sfi
 
-                 , (uint)System.Runtime.InteropServices.Marshal.SizeOf(sfi)
 
-                 , (uint)(SHGFI.SysIconIndex | SHGFI.LargeIcon | SHGFI.UseFileAttributes));
 
-             return sfi.iIcon;
 
-         }
 
-         // 256*256
 
-         public static IntPtr GetJumboIcon(int iImage)
 
-         {
 
-             IImageList spiml = null;
 
-             Guid guil = new Guid(IID_IImageList);//or IID_IImageList
 
-             Shell32.SHGetImageList(Shell32.SHIL_JUMBO, ref guil, ref spiml);
 
-             IntPtr hIcon = IntPtr.Zero;
 
-             spiml.GetIcon(iImage, Shell32.ILD_TRANSPARENT | Shell32.ILD_IMAGE, ref hIcon);
 
-             return hIcon;
 
-         }
 
-         const string IID_IImageList = "46EB5926-582E-4017-9FDF-E8998DAA0950";
 
-         const string IID_IImageList2 = "192B9D83-50FC-457B-90A0-2B82A8B5DAE1";
 
-         public static class Shell32
 
-         {
 
-             public const int SHIL_LARGE = 0x0;
 
-             public const int SHIL_SMALL = 0x1;
 
-             public const int SHIL_EXTRALARGE = 0x2;
 
-             public const int SHIL_SYSSMALL = 0x3;
 
-             public const int SHIL_JUMBO = 0x4;
 
-             public const int SHIL_LAST = 0x4;
 
-             public const int ILD_TRANSPARENT = 0x00000001;
 
-             public const int ILD_IMAGE = 0x00000020;
 
-             [DllImport("shell32.dll", EntryPoint = "#727")]
 
-             public extern static int SHGetImageList(int iImageList, ref Guid riid, ref IImageList ppv);
 
-             [DllImport("user32.dll", EntryPoint = "DestroyIcon", SetLastError = true)]
 
-             public static unsafe extern int DestroyIcon(IntPtr hIcon);
 
-             [DllImport("shell32.dll")]
 
-             public static extern uint SHGetIDListFromObject([MarshalAs(UnmanagedType.IUnknown)] object iUnknown, out IntPtr ppidl);
 
-             [DllImport("Shell32.dll")]
 
-             public static extern IntPtr SHGetFileInfo(
 
-                 string pszPath,
 
-                 uint dwFileAttributes,
 
-                 ref SHFILEINFO psfi,
 
-                 uint cbFileInfo,
 
-                 uint uFlags
 
-             );
 
-         }
 
-         [Flags]
 
-         enum SHGFI : uint
 
-         {
 
-             /// <summary>get icon</summary>
 
-             Icon = 0x000000100,
 
-             /// <summary>get display name</summary>
 
-             DisplayName = 0x000000200,
 
-             /// <summary>get type name</summary>
 
-             TypeName = 0x000000400,
 
-             /// <summary>get attributes</summary>
 
-             Attributes = 0x000000800,
 
-             /// <summary>get icon location</summary>
 
-             IconLocation = 0x000001000,
 
-             /// <summary>return exe type</summary>
 
-             ExeType = 0x000002000,
 
-             /// <summary>get system icon index</summary>
 
-             SysIconIndex = 0x000004000,
 
-             /// <summary>put a link overlay on icon</summary>
 
-             LinkOverlay = 0x000008000,
 
-             /// <summary>show icon in selected state</summary>
 
-             Selected = 0x000010000,
 
-             /// <summary>get only specified attributes</summary>
 
-             Attr_Specified = 0x000020000,
 
-             /// <summary>get large icon</summary>
 
-             LargeIcon = 0x000000000,
 
-             /// <summary>get small icon</summary>
 
-             SmallIcon = 0x000000001,
 
-             /// <summary>get open icon</summary>
 
-             OpenIcon = 0x000000002,
 
-             /// <summary>get shell size icon</summary>
 
-             ShellIconSize = 0x000000004,
 
-             /// <summary>pszPath is a pidl</summary>
 
-             PIDL = 0x000000008,
 
-             /// <summary>use passed dwFileAttribute</summary>
 
-             UseFileAttributes = 0x000000010,
 
-             /// <summary>apply the appropriate overlays</summary>
 
-             AddOverlays = 0x000000020,
 
-             /// <summary>Get the index of the overlay in the upper 8 bits of the iIcon</summary>
 
-             OverlayIndex = 0x000000040,
 
-         }
 
-         [StructLayout(LayoutKind.Sequential)]
 
-         public struct SHFILEINFO
 
-         {
 
-             public const int NAMESIZE = 80;
 
-             public IntPtr hIcon;
 
-             public int iIcon;
 
-             public uint dwAttributes;
 
-             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
 
-             public string szDisplayName;
 
-             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
 
-             public string szTypeName;
 
-         };
 
-         [StructLayout(LayoutKind.Sequential)]
 
-         public struct RECT
 
-         {
 
-             public int left, top, right, bottom;
 
-         }
 
-         [StructLayout(LayoutKind.Sequential)]
 
-         public struct POINT
 
-         {
 
-             int x;
 
-             int y;
 
-         }
 
-         [StructLayout(LayoutKind.Sequential)]
 
-         public struct IMAGELISTDRAWPARAMS
 
-         {
 
-             public int cbSize;
 
-             public IntPtr himl;
 
-             public int i;
 
-             public IntPtr hdcDst;
 
-             public int x;
 
-             public int y;
 
-             public int cx;
 
-             public int cy;
 
-             public int xBitmap;    // x offest from the upperleft of bitmap
 
-             public int yBitmap;    // y offset from the upperleft of bitmap
 
-             public int rgbBk;
 
-             public int rgbFg;
 
-             public int fStyle;
 
-             public int dwRop;
 
-             public int fState;
 
-             public int Frame;
 
-             public int crEffect;
 
-         }
 
-         [StructLayout(LayoutKind.Sequential)]
 
-         public struct IMAGEINFO
 
-         {
 
-             public IntPtr hbmImage;
 
-             public IntPtr hbmMask;
 
-             public int Unused1;
 
-             public int Unused2;
 
-             public RECT rcImage;
 
-         }
 
-         [ComImportAttribute()]
 
-         [GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950")]
 
-         [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
 
-         public interface IImageList
 
-         {
 
-             [PreserveSig]
 
-             int Add(
 
-             IntPtr hbmImage,
 
-             IntPtr hbmMask,
 
-             ref int pi);
 
-             [PreserveSig]
 
-             int ReplaceIcon(
 
-             int i,
 
-             IntPtr hicon,
 
-             ref int pi);
 
-             [PreserveSig]
 
-             int SetOverlayImage(
 
-             int iImage,
 
-             int iOverlay);
 
-             [PreserveSig]
 
-             int Replace(
 
-             int i,
 
-             IntPtr hbmImage,
 
-             IntPtr hbmMask);
 
-             [PreserveSig]
 
-             int AddMasked(
 
-             IntPtr hbmImage,
 
-             int crMask,
 
-             ref int pi);
 
-             [PreserveSig]
 
-             int Draw(
 
-             ref IMAGELISTDRAWPARAMS pimldp);
 
-             [PreserveSig]
 
-             int Remove(int i);
 
-             [PreserveSig]
 
-             int GetIcon(
 
-             int i,
 
-             int flags,
 
-             ref IntPtr picon);
 
-             [PreserveSig]
 
-             int GetImageInfo(
 
-             int i,
 
-             ref IMAGEINFO pImageInfo);
 
-             [PreserveSig]
 
-             int Copy(
 
-             int iDst,
 
-             IImageList punkSrc,
 
-             int iSrc,
 
-             int uFlags);
 
-             [PreserveSig]
 
-             int Merge(
 
-             int i1,
 
-             IImageList punk2,
 
-             int i2,
 
-             int dx,
 
-             int dy,
 
-             ref Guid riid,
 
-             ref IntPtr ppv);
 
-             [PreserveSig]
 
-             int Clone(
 
-             ref Guid riid,
 
-             ref IntPtr ppv);
 
-             [PreserveSig]
 
-             int GetImageRect(
 
-             int i,
 
-             ref RECT prc);
 
-             [PreserveSig]
 
-             int GetIconSize(
 
-             ref int cx,
 
-             ref int cy);
 
-             [PreserveSig]
 
-             int SetIconSize(
 
-             int cx,
 
-             int cy);
 
-             [PreserveSig]
 
-             int GetImageCount(ref int pi);
 
-             [PreserveSig]
 
-             int SetImageCount(
 
-             int uNewCount);
 
-             [PreserveSig]
 
-             int SetBkColor(
 
-             int clrBk,
 
-             ref int pclr);
 
-             [PreserveSig]
 
-             int GetBkColor(
 
-             ref int pclr);
 
-             [PreserveSig]
 
-             int BeginDrag(
 
-             int iTrack,
 
-             int dxHotspot,
 
-             int dyHotspot);
 
-             [PreserveSig]
 
-             int EndDrag();
 
-             [PreserveSig]
 
-             int DragEnter(
 
-             IntPtr hwndLock,
 
-             int x,
 
-             int y);
 
-             [PreserveSig]
 
-             int DragLeave(
 
-             IntPtr hwndLock);
 
-             [PreserveSig]
 
-             int DragMove(
 
-             int x,
 
-             int y);
 
-             [PreserveSig]
 
-             int SetDragCursorImage(
 
-             ref IImageList punk,
 
-             int iDrag,
 
-             int dxHotspot,
 
-             int dyHotspot);
 
-             [PreserveSig]
 
-             int DragShowNolock(
 
-             int fShow);
 
-             [PreserveSig]
 
-             int GetDragImage(
 
-             ref POINT ppt,
 
-             ref POINT pptHotspot,
 
-             ref Guid riid,
 
-             ref IntPtr ppv);
 
-             [PreserveSig]
 
-             int GetItemFlags(
 
-             int i,
 
-             ref int dwFlags);
 
-             [PreserveSig]
 
-             int GetOverlayImage(
 
-             int iOverlay,
 
-             ref int piIndex);
 
-         };
 
-     }
 
- }
 
 
  |