按文件类型获取其图标

python列表平铺 4.map(func,*iterable):func函数作用于iterable中的每个元素。大多数情况下不知道最深的嵌套是第几层,所以每次只能使用。start---指定相加的参数,如:没有指定默认为0;iterable---可迭代对象、列表、元组、集合; 阅读详情
 转载

按文件类型获取其图标有很多软件如"WinRar" 能在它的文件列表中显示各类文件相关的图标。在网上查了一下,发现可以用 SHGetFileInfo、ExtractAssociatedIcon等winapi函数根据文件获取文件在系统中对应的图标。刚开始用的时候觉得好像它们只能返回存在的文件的图标。 若要用这些函数去根据扩展名获取图标,则需要先创建一个假文件, 获取图标后又删除,太麻烦。后来重新查了一下,发现用SHGetFileInfo函数可以根据扩展名获取文件图标。以下为示例代码。


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Runtime.InteropServices;

namespace IconHelper
{
    
/// <summary>
    
/// Provides static methods to read system icons for both folders and files.
    
/// </summary>
    
/// <example>
    
/// <code>IconReader.GetFileIcon("c://general.xls");</code>
    
/// </example>

    public class IconReader
    
{
        
/// <summary>
        
/// Options to specify the size of icons to return.
        
/// </summary>

        public enum IconSize
        
{
            
/// <summary>
            
/// Specify large icon - 32 pixels by 32 pixels.
            
/// </summary>

            Large = 0,
            
/// <summary>
            
/// Specify small icon - 16 pixels by 16 pixels.
            
/// </summary>

            Small = 1
        }


        
/// <summary>
        
/// Options to specify whether folders should be in the open or closed state.
        
/// </summary>

        public enum FolderType
        
{
            
/// <summary>
            
/// Specify open folder.
            
/// </summary>

            Open = 0,
            
/// <summary>
            
/// Specify closed folder.
            
/// </summary>

            Closed = 1
        }


        
/// <summary>
        
/// Returns an icon for a given file - indicated by the name parameter.
        
/// </summary>
        
/// <param name="name">Pathname for file.</param>
        
/// <param name="size">Large or small</param>
        
/// <param name="linkOverlay">Whether to include the link icon</param>
        
/// <returns>System.Drawing.Icon</returns>

        public static System.Drawing.Icon GetFileIcon(string name, IconSize size, bool linkOverlay)
        
{
            Shell32.SHFILEINFO shfi 
= new Shell32.SHFILEINFO();
            
uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES;

            
if (true == linkOverlay) flags += Shell32.SHGFI_LINKOVERLAY;

            
/* Check the size specified for return. */
            
if (IconSize.Small == size)
            
{
                flags 
+= Shell32.SHGFI_SMALLICON;
            }

            
else
            
{
                flags 
+= Shell32.SHGFI_LARGEICON;
            }


            Shell32.SHGetFileInfo(name,
                Shell32.FILE_ATTRIBUTE_NORMAL,
                
ref shfi,
                (
uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
                flags);

            
// Copy (clone) the returned icon to a new object, thus allowing us to clean-up properly
            System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();
            User32.DestroyIcon(shfi.hIcon);        
// Cleanup
            return icon;
        }


        
/// <summary>
        
/// Used to access system folder icons.
        
/// </summary>
        
/// <param name="size">Specify large or small icons.</param>
        
/// <param name="folderType">Specify open or closed FolderType.</param>
        
/// <returns>System.Drawing.Icon</returns>

        public static System.Drawing.Icon GetFolderIcon(IconSize size, FolderType folderType)
        
{
            
// Need to add size check, although errors generated at present!
            uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES;

            
if (FolderType.Open == folderType)
            
{
                flags 
+= Shell32.SHGFI_OPENICON;
            }


            
if (IconSize.Small == size)
            
{
                flags 
+= Shell32.SHGFI_SMALLICON;
            }

            
else
            
{
                flags 
+= Shell32.SHGFI_LARGEICON;
            }


            
// Get the folder icon
            Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
            Shell32.SHGetFileInfo(
null,
                Shell32.FILE_ATTRIBUTE_DIRECTORY,
                
ref shfi,
                (
uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
                flags);

            System.Drawing.Icon.FromHandle(shfi.hIcon);    
// Load the icon from an HICON handle

            
// Now clone the icon, so that it can be successfully stored in an ImageList
            System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();

            User32.DestroyIcon(shfi.hIcon);        
// Cleanup
            return icon;
        }

    }


    
/// <summary>
    
/// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code
    
/// courtesy of MSDN Cold Rooster Consulting case study.
    
/// </summary>
    
/// 


    
// This code has been left largely untouched from that in the CRC example. The main changes have been moving
    
// the icon reading code over to the IconReader type.
    public class Shell32
    
{

        
public const int MAX_PATH = 256;
        [StructLayout(LayoutKind.Sequential)]
        
public struct SHITEMID
        
{
            
public ushort cb;
            [MarshalAs(UnmanagedType.LPArray)]
            
public byte[] abID;
        }


        [StructLayout(LayoutKind.Sequential)]
        
public struct ITEMIDLIST
        
{
            
public SHITEMID mkid;
        }


        [StructLayout(LayoutKind.Sequential)]
        
public struct BROWSEINFO
        
{
            
public IntPtr hwndOwner;
            
public IntPtr pidlRoot;
            
public IntPtr pszDisplayName;
            [MarshalAs(UnmanagedType.LPTStr)]
            
public string lpszTitle;
            
public uint ulFlags;
            
public IntPtr lpfn;
            
public int lParam;
            
public IntPtr iImage;
        }


        
// Browsing for directory.
        public const uint BIF_RETURNONLYFSDIRS = 0x0001;
        
public const uint BIF_DONTGOBELOWDOMAIN = 0x0002;
        
public const uint BIF_STATUSTEXT = 0x0004;
        
public const uint BIF_RETURNFSANCESTORS = 0x0008;
        
public const uint BIF_EDITBOX = 0x0010;
        
public const uint BIF_VALIDATE = 0x0020;
        
public const uint BIF_NEWDIALOGSTYLE = 0x0040;
        
public const uint BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX);
        
public const uint BIF_BROWSEINCLUDEURLS = 0x0080;
        
public const uint BIF_BROWSEFORCOMPUTER = 0x1000;
        
public const uint BIF_BROWSEFORPRINTER = 0x2000;
        
public const uint BIF_BROWSEINCLUDEFILES = 0x4000;
        
public const uint BIF_SHAREABLE = 0x8000;

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

        
public const uint SHGFI_ICON = 0x000000100;     // get icon
        public const uint SHGFI_DISPLAYNAME = 0x000000200;     // get display name
        public const uint SHGFI_TYPENAME = 0x000000400;     // get type name
        public const uint SHGFI_ATTRIBUTES = 0x000000800;     // get attributes
        public const uint SHGFI_ICONLOCATION = 0x000001000;     // get icon location
        public const uint SHGFI_EXETYPE = 0x000002000;     // return exe type
        public const uint SHGFI_SYSICONINDEX = 0x000004000;     // get system icon index
        public const uint SHGFI_LINKOVERLAY = 0x000008000;     // put a link overlay on icon
        public const uint SHGFI_SELECTED = 0x000010000;     // show icon in selected state
        public const uint SHGFI_ATTR_SPECIFIED = 0x000020000;     // get only specified attributes
        public const uint SHGFI_LARGEICON = 0x000000000;     // get large icon
        public const uint SHGFI_SMALLICON = 0x000000001;     // get small icon
        public const uint SHGFI_OPENICON = 0x000000002;     // get open icon
        public const uint SHGFI_SHELLICONSIZE = 0x000000004;     // get shell size icon
        public const uint SHGFI_PIDL = 0x000000008;     // pszPath is a pidl
        public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010;     // use passed dwFileAttribute
        public const uint SHGFI_ADDOVERLAYS = 0x000000020;     // apply the appropriate overlays
        public const uint SHGFI_OVERLAYINDEX = 0x000000040;     // Get the index of the overlay

        
public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
        
public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;

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


    
/// <summary>
    
/// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example.
    
/// </summary>

    public class User32
    
{
        
/// <summary>
        
/// Provides access to function required to delete handle. This method is used internally
        
/// and is not required to be called separately.
        
/// </summary>
        
/// <param name="hIcon">Pointer to icon handle.</param>
        
/// <returns>N/A</returns>

        [DllImport("User32.dll")]
        
public static extern int DestroyIcon(IntPtr hIcon);
    }

}
使用MFC获取文件类型图标列表的实践方法 Windows文件图标是操作系统中用于表示文件和文件夹类型的一种视觉符号。它们不仅增强了用户界面的美观性,而且通过直观的图标样式帮助用户快速识别和分类不同类型的文件。Shell扩展是一种允许开发者自定义文件上下文菜单、属性页等界面的编程接口。通过深入理解这些图标及Shell扩展的工作机制,开发者可以创建更为用户友好的应用程序。MFC(Microsoft Foundation Classes)是微软公司提供的一套C++类库,用于简化Windows应用程序的开发。 阅读详情

相关推荐

MFC通过文件类型名获取文件图标列表

不需要文件实际存在,只要传递一个文件后缀名,就可以获取相应的文件列表。 应用场合: 适合在客户端获取服务器文件名来显示文件图标

python的linux电脑上图标_基于文件的mimetype获取图标,Linux+Python

核心问题:如何将mimetype-image/png转换为图标文件的实际路径-/usr/share/icons/Menda-Circle/mimetypes/24x24/application-image-png.svg在尊重linux发行版的图标主题集的同时?在自己的进度:在mimetypes.guess_类型()可以让我很容易地根据文件名来模拟文件的类型。在不容易的是将mimetype转换为指...

weixin_39709674的博客 205

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1881

[Win32] python纯ctypes获取exe图标

Python使用纯ctypes的win32api搞定exe提取图标

代码见:github/THZrry/demos_in_csdn 1926

告别第三方工具!用Windows自带蓝牙玩转BLE设备调试(保姆级图文教程)

本文详细介绍了如何利用Windows自带的蓝牙功能进行BLE设备调试,无需第三方工具。从硬件准备、系统配置到实战操作,提供保姆级图文教程,帮助开发者高效完成设备发现、数据交互等全流程调试工作。特别适合物联网开发者和智能硬件爱好者。

o5p6q的博客 726

Proteus8.0仿真应用设计(九十一)基于STM32CubeMX、STM32F103C8T6 、FREERTOS、MCP41010(SPI接口)的8位数字电位器应用设计仿真

MCP41010是一款SPI接口的8位数字电位器。

zhusl6688的博客 558

pyhton 获取windows文件关联的图标

import wx from win32com.shell import shell, shellcon from win32con import FILE_ATTRIBUTE_NORMAL def extension_to_bitmap(extension): """dot is mandatory in extension""" flags = shellcon.SHGFI_

xugangjava的专栏 2293

交通规划仿真软件:TransCAD_(7).公交系统规划与分析

通过TransCAD进行公交系统规划与分析,可以有效地评估公交网络的性能,优化线路设计,提高服务质量。数据准备、模型建立、仿真运行和结果分析是公交系统规划与分析的关键步骤。在实际应用中,规划者和分析师可以根据仿真结果提出具体的优化建议,不断完善公交系统的运行效率和乘客体验。

kkchenjj的博客 955

根据文件名或文件扩展名获取文件的默认图标

新建一个vs2010 窗体项目,新建按钮button和图片picturebox 下面是程序 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;u...

weixin_34152820的博客 943

可信启动方案设计

本博客简要解释了TF-A中的Measured-Boot可信启动设计实现。

AI-安全-功耗 1203

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

视觉人机器视觉的博客 1741

delphi 动态获取文件类型的图标

delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个。真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox)、列表框(ListBox)、等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标。在一般的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前...

dkopg24406的专栏 526

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2108

获取Windows系统注册的文件类型和图标

烦死,写了快一个小时。不知道怎么碰了一下,就没了。随便记记吧。 就是获取下面这个新建里面的内容: 思路: (1)获取系统已注册的文件类型 注册表路径:MFC版获取文件类型 地址:http://blog.youkuaiyun.com/qq2399431200/article/details/22923091  HKEY_CURRENT_USER\Software\Microsoft\W

陈佳迎的博客 2811

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

通过HFS文件类型码获取图标

/* Get the icon for a given file type. The file type may be a filename extension, or a HFS code encoded via NSFileTypeForHFSTypeCode, or a Universal Type Identifier (UTI). Returns a default icon if

lipingqingqing的专栏 2101

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[转贴]按文件类型获取其图标

原帖地址:http://tianfang.cnblogs.com/ usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Runtime.InteropServices;namespaceIconHelper{...

weixin_30433075的博客 109

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

获取各文件类型在系统中注册的图标

作者:野比 (conmajia@gmail.com) 时间:May, 2012 封面图片为野比原创,请勿未经允许私自引用 下载 DEMO 下载源码 (Last updated: May 20th, 2012)    注:程序里用到的 Windows API 是看了网上匿名人士的作品拿来应用的, 向所有无私奉献的人们致敬!

My name is Conmajia 2149

HOW TO:获取文件类型图标和类型说明

Author:水如烟 如果查看一个有效文件,信息如下:如果查看文件类型,比如输入“.doc”,信息如下:类:Imports System.Runtime.InteropServicesNamespace LzmTW.uSystem.uWindow.WinAPI32    Friend Class UnSafeNativeMethods        Flags()> _

水如烟 2095

java获取文件图标_Java GUI中根据文件类型获取文件的图标

package cn.edu.hactcm;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.File;import java.io.IOException;import javax.swing.BoxLayout;im...

weixin_42545163的博客 195
上一篇: SQLite中的自增长字段
下一篇: 隐藏窗体的关闭键
first_fish
博客等级 码龄21年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值