zoukankan      html  css  js  c++  java
  • 根据文件名或文件扩展名获取文件的默认图标

    有时候我们需要根据不同的文件扩展名显示不同的图标,比如用C#做一个资源管理器。在C#中可以使用 Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(fileFullName) 来得到指定文件图标。但是Icon.ExtractAssociatedIcon 只能获取大图标,要获取小图标还是要使用 API。

    using System;
    using System.Runtime.InteropServices;
    using System.Drawing;

    namespace MyNamespace
    {
        
    public class FileIcon
        {
            
    /// <summary>
            
    ///  获取文件的默认图标
            
    /// </summary>
            
    /// <param name="fileName">文件名。
            
    ///     可以只是文件名,甚至只是文件的扩展名(.*);
            
    ///     如果想获得.ICO文件所表示的图标,则必须是文件的完整路径。
            
    /// </param>
            
    /// <param name="largeIcon">是否大图标</param>
            
    /// <returns>文件的默认图标</returns>
            public static Icon GetFileIcon(string fileName, bool largeIcon)
            {
                SHFILEINFO info 
    = new SHFILEINFO(true);
                
    int cbFileInfo = Marshal.SizeOf(info);
                SHGFI flags;
                
    if (largeIcon)
                    flags 
    = SHGFI.Icon | SHGFI.LargeIcon | SHGFI.UseFileAttributes;
                
    else
                    flags 
    = SHGFI.Icon | SHGFI.SmallIcon | SHGFI.UseFileAttributes;

                SHGetFileInfo(fileName, 
    256out info, (uint)cbFileInfo, flags);
                
    return Icon.FromHandle(info.hIcon);
            }


            [DllImport(
    "Shell32.dll")]
            
    private static extern int SHGetFileInfo
              (
              
    string pszPath,
              
    uint dwFileAttributes,
              
    out   SHFILEINFO psfi,
              
    uint cbfileInfo,
              SHGFI uFlags
              );
     
            [StructLayout(LayoutKind.Sequential)]
            
    private struct SHFILEINFO
            {
                
    public SHFILEINFO(bool b)
                {
                    hIcon 
    = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
                }
                
    public IntPtr hIcon;
                
    public int iIcon;
                
    public uint dwAttributes;
                [MarshalAs(UnmanagedType.LPStr, SizeConst 
    = 260)]
                
    public string szDisplayName;
                [MarshalAs(UnmanagedType.LPStr, SizeConst 
    = 80)]
                
    public string szTypeName;
            };
     
            
    private enum SHGFI
            {
                SmallIcon 
    = 0x00000001,
                LargeIcon 
    = 0x00000000,
                Icon 
    = 0x00000100,
                DisplayName 
    = 0x00000200,
                Typename 
    = 0x00000400,
                SysIconIndex 
    = 0x00004000,
                UseFileAttributes 
    = 0x00000010
            }
        }
    }
  • 相关阅读:
    HDU2034:人见人爱A-B
    Codeup1085: 阶乘的和
    HDU2037:今年暑假不AC
    剑指Offer(Java版)第二十七题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
    剑指Offer(Java版)第二十六题:输入两个整数序列,第一个序列表示栈的压入顺序, 请判断第二个序列是否为该栈的弹出顺序。 假设压入栈的所有数字均不相等。 例如序列1、2、3、4、5是某栈的压栈序列, 序列5、4、3、2、1是该压栈序列对应的一个弹出序列, 但4、3、5、1、2就不可能是该压栈序列的弹出序列。
    剑指Offer(Java版)第二十五题:包含min函数的栈
    剑指Offer(Java版)第二十四题:顺时针打印矩阵
    MongoDB学习笔记10——分片
    MongoDB学习笔记9——复制
    MongoDB学习笔记8——优化
  • 原文地址:https://www.cnblogs.com/anjou/p/953820.html
Copyright © 2011-2022 走看看