C#获取文件超大图标256*256(转)
阅读原文时间:2021年04月23日阅读:3

从Bing搜索得到,保存于此

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Media.Imaging; using System.Windows.Media; using System.Diagnostics; namespace WpfApplication1
{ public class c_icon_of_path
{ private struct RECT
{ public int Left; public int Top; public int Right; public int Bottom;
} private struct POINT
{ public int x; public int y;
} // Constants that we need in the function call

    private const int SHGFI\_ICON = 0x100; private const int SHGFI\_SMALLICON = 0x1; private const int SHGFI\_LARGEICON = 0x0; private const int SHIL\_JUMBO = 0x4; private const int SHIL\_EXTRALARGE = 0x2; // This structure will contain information about the file

    public struct SHFILEINFO
    { // Handle to the icon representing the file

        public IntPtr hIcon; // Index of the icon within the image list

        public int iIcon; // Various attributes of the file

        public uint dwAttributes; // Path to the file

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string szDisplayName; // File type
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName;

    };

    \[System.Runtime.InteropServices.DllImport("Kernel32.dll")\] public static extern Boolean CloseHandle(IntPtr handle); private 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)\] private struct IMAGEINFO
    { public IntPtr hbmImage; public IntPtr hbmMask; public int Unused1; public int Unused2; public RECT rcImage;
    } #region Private ImageList COM Interop (XP) \[ComImportAttribute()\]
    \[GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950")\]
    \[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)\] //helpstring("Image List"),
    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);
    }; #endregion

    ///
    /// SHGetImageList is not exported correctly in XP.  See KB316931 /// http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316931 /// Apparently (and hopefully) ordinal 727 isn't going to change. ///
    \[DllImport("shell32.dll", EntryPoint = "#727")\] private extern static int SHGetImageList( int iImageList, ref Guid riid, out IImageList ppv
        ); // The signature of SHGetFileInfo (located in Shell32.dll)
    \[DllImport("Shell32.dll")\] public static extern int SHGetFileInfo(string pszPath, int dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

    \[DllImport("Shell32.dll")\] public static extern int SHGetFileInfo(IntPtr pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

    \[DllImport("shell32.dll", SetLastError = true)\] static extern int SHGetSpecialFolderLocation(IntPtr hwndOwner, Int32 nFolder, ref IntPtr ppidl);

    \[DllImport("user32")\] public static extern int DestroyIcon(IntPtr hIcon); public struct pair
    { public System.Drawing.Icon icon { get; set; } public IntPtr iconHandleToDestroy { set; get; }

    } public static int DestroyIcon2(IntPtr hIcon)
    { return DestroyIcon(hIcon);
    } private static BitmapSource bitmap\_source\_of\_icon(System.Drawing.Icon ic)
    { var ic2 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(ic.Handle,
                                                System.Windows.Int32Rect.Empty,
                                                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        ic2.Freeze(); return ((BitmapSource)ic2);
    } //public static BitmapSource SystemIcon(bool small, ShellLib.ShellApi.CSIDL csidl) //{ // IntPtr pidlTrash = IntPtr.Zero; // int hr = SHGetSpecialFolderLocation(IntPtr.Zero, (int)csidl, ref pidlTrash); // Debug.Assert(hr == 0); // SHFILEINFO shinfo = new SHFILEINFO(); // uint SHGFI\_USEFILEATTRIBUTES = 0x000000010; //    // Get a handle to the large icon // uint flags; // uint SHGFI\_PIDL = 0x000000008; // if (!small) // { // flags = SHGFI\_PIDL | SHGFI\_ICON | SHGFI\_LARGEICON | SHGFI\_USEFILEATTRIBUTES; // } // else // { // flags = SHGFI\_PIDL | SHGFI\_ICON | SHGFI\_SMALLICON | SHGFI\_USEFILEATTRIBUTES; // } // var res = SHGetFileInfo(pidlTrash, 0, ref shinfo, Marshal.SizeOf(shinfo), flags); // Debug.Assert(res != 0); // var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); // Marshal.FreeCoTaskMem(pidlTrash); // var bs = bitmap\_source\_of\_icon(myIcon); // myIcon.Dispose(); // bs.Freeze(); // importantissimo se no fa memory leak // DestroyIcon(shinfo.hIcon); // CloseHandle(shinfo.hIcon); // return bs; //}

    public static BitmapSource icon\_of\_path(string FileName, bool small, bool checkDisk, bool addOverlay)
    {
        SHFILEINFO shinfo \= new SHFILEINFO(); uint SHGFI\_USEFILEATTRIBUTES = 0x000000010; uint SHGFI\_LINKOVERLAY = 0x000008000; uint flags; if (small)
        {
            flags \= SHGFI\_ICON | SHGFI\_SMALLICON;
        } else {
            flags \= SHGFI\_ICON | SHGFI\_LARGEICON;
        } if (!checkDisk)
            flags |= SHGFI\_USEFILEATTRIBUTES; if (addOverlay)
            flags |= SHGFI\_LINKOVERLAY; var res = SHGetFileInfo(FileName, 0, ref shinfo, Marshal.SizeOf(shinfo), flags); if (res == 0)
        { throw (new System.IO.FileNotFoundException());
        } var myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon); var bs = bitmap\_source\_of\_icon(myIcon);
        myIcon.Dispose();
        bs.Freeze(); // importantissimo se no fa memory leak

DestroyIcon(shinfo.hIcon);
CloseHandle(shinfo.hIcon); return bs;

    } public static BitmapSource icon\_of\_path\_large(string FileName, bool jumbo, bool checkDisk)
    {

        SHFILEINFO shinfo \= new SHFILEINFO(); uint SHGFI\_USEFILEATTRIBUTES = 0x000000010; uint SHGFI\_SYSICONINDEX = 0x4000; int FILE\_ATTRIBUTE\_NORMAL = 0x80; uint flags;
        flags \= SHGFI\_SYSICONINDEX; if (!checkDisk)  // This does not seem to work. If I try it, a folder icon is always returned.
            flags |= SHGFI\_USEFILEATTRIBUTES; var res = SHGetFileInfo(FileName, FILE\_ATTRIBUTE\_NORMAL, ref shinfo, Marshal.SizeOf(shinfo), flags); if (res == 0)
        { throw (new System.IO.FileNotFoundException());
        } var iconIndex = shinfo.iIcon; // Get the System IImageList object from the Shell:
        Guid iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");

        IImageList iml; int size = jumbo ? SHIL\_JUMBO : SHIL\_EXTRALARGE; var hres = SHGetImageList(size, ref iidImageList, out  iml); // writes iml //if (hres == 0) //{ // throw (new System.Exception("Error SHGetImageList")); //}

IntPtr hIcon = IntPtr.Zero; int ILD_TRANSPARENT = 1;
hres = iml.GetIcon(iconIndex, ILD_TRANSPARENT, ref hIcon); //if (hres == 0) //{ // throw (new System.Exception("Error iml.GetIcon")); //}

        var myIcon = System.Drawing.Icon.FromHandle(hIcon); var bs = bitmap\_source\_of\_icon(myIcon);
        myIcon.Dispose();
        bs.Freeze(); // very important to avoid memory leak

DestroyIcon(hIcon); //CloseHandle(hIcon);

        return bs;

    }
}

}

转载于:https://www.cnblogs.com/sfcyyc/p/5216695.html