123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Runtime.InteropServices;
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
- using System.Windows.Media.Imaging;
- namespace GeekDesk.Util
- {
- class FileIcon
- {
- public static Icon GetIcon(string filePath)
- {
- IntPtr hIcon = GetJumboIcon(GetIconIndex(filePath));
- Icon ico = Icon.FromHandle(hIcon);
- return ico;
- }
- public static BitmapImage GetBitmapImage(string filePath)
- {
- //Icon ico;
- //BitmapImage bmpImage = null;
- //MemoryStream strm;
- //using (ico = GetIcon(filePath))
- //{
- // Bitmap bmp = ico.ToBitmap();
- // using (strm = new MemoryStream())
- // {
- // bmp.Save(strm, System.Drawing.Imaging.ImageFormat.Png);
- // bmpImage = new BitmapImage();
- // bmpImage.BeginInit();
- // strm.Seek(0, SeekOrigin.Begin);
- // bmpImage.StreamSource = strm;
- // bmpImage.EndInit();
- // }
- //}
- //return bmpImage;
- Icon ico = GetIcon(filePath);
- Bitmap bmp = ico.ToBitmap();
- MemoryStream strm = new MemoryStream();
- bmp.Save(strm, System.Drawing.Imaging.ImageFormat.Png);
- BitmapImage bmpImage = new BitmapImage();
- bmpImage.BeginInit();
- strm.Seek(0, SeekOrigin.Begin);
- bmpImage.StreamSource = strm;
- bmpImage.EndInit();
-
- return bmpImage.Clone();
- }
- 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_IImageList2);//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);
- };
- }
- }
|