[转]C# 获取系统文件图标

时间:2023-02-01 03:05:18
//获取文件的图标
 this.Icon = GetFileIcon(@"c:\gdiplus.dll");
//获取文件夹图标
 this.Icon = GetDirectoryIcon();    

[StructLayout(LayoutKind.Sequential)]
    public struct SHFILEINFO
    {
        public IntPtr hIcon;
        public IntPtr iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
        public string szTypeName;
    }  

    /// <summary>
    /// 返回系统设置的图标
    /// </summary>
    /// <param name="pszPath">文件路径 如果为""  返回文件夹的</param>
    </param>
    /// <param name="psfi">结构体</param>
    /// <param name="cbSizeFileInfo">结构体大小</param>
    /// <param name="uFlags">枚举类型</param>
    /// <returns>-1失败</returns>
    [DllImport("shell32.dll")]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref   SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);  

    public enum SHGFI
    {
        SHGFI_ICON = 0x100,
        SHGFI_LARGEICON = 0x0,
        SHGFI_USEFILEATTRIBUTES = 0x10
    }  

    /// <summary>
    /// 获取文件图标 zgke@sina.com qq:116149
    /// </summary>
    /// <param name="p_Path">文件全路径</param>
    /// <returns>图标</returns>
    public static Icon GetFileIcon(string p_Path)
    {
        SHFILEINFO _SHFILEINFO = new SHFILEINFO();
        IntPtr _IconIntPtr = SHGetFileInfo(p_Path, , ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON | SHGFI.SHGFI_USEFILEATTRIBUTES));
        if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
        Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
        return _Icon;
    }
    /// <summary>
    /// 获取文件夹图标  zgke@sina.com qq:116149
    /// </summary>
    /// <returns>图标</returns>
    public static Icon GetDirectoryIcon()
    {
        SHFILEINFO _SHFILEINFO = new SHFILEINFO();
        IntPtr _IconIntPtr = SHGetFileInfo(, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON));
        if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
        Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
        return _Icon;
    }