371 lines
11 KiB
C#
371 lines
11 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
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);
|
|
};
|
|
|
|
}
|
|
|
|
}
|