zoukankan      html  css  js  c++  java
  • C# 获取系统图标类

    C# 获取系统图标类

    来源 http://blog.5d.cn/vip/allinhands/200505/83959.html

    源码下载

    代码
    using System;
    using System.IO;
    using System.Drawing;
    using Microsoft.Win32;


    using System.Runtime.InteropServices;


    namespace ThunderStarter
    {
    ///
    /// 提供从操作系统读取图标的方法
    ///
    public class GetSystemIcon
    {
    ///
    /// 依据文件名读取图标,若指定文件不存在,则返回空值。
    ///
    ///
    ///
    public Icon GetIconByFileName(string fileName)
    {
    if (fileName == null || fileName.Equals(string.Empty)) return null;
    if (!File.Exists(fileName)) return null;

    SHFILEINFO shinfo
    = new SHFILEINFO();
    //Use this to get the small Icon
    Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
    //The icon is returned in the hIcon member of the shinfo struct
    System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
    return myIcon;
    }

    ///
    /// 给出文件扩展名(.*),返回相应图标
    /// 若不以"."开头则返回文件夹的图标。
    ///
    ///
    ///
    ///
    public Icon GetIconByFileType(string fileType, bool isLarge)
    {
    if (fileType == null || fileType.Equals(string.Empty)) return null;

    RegistryKey regVersion
    = null;
    string regFileType = null;
    string regIconString = null;
    string systemDirectory = Environment.SystemDirectory + "\\";

    if (fileType[0] == '.')
    {
    //读系统注册表中文件类型信息
    regVersion = Registry.ClassesRoot.OpenSubKey(fileType, true);
    if (regVersion != null)
    {
    regFileType
    = regVersion.GetValue("") as string;
    regVersion.Close();
    regVersion
    = Registry.ClassesRoot.OpenSubKey(regFileType + @"\DefaultIcon", true);
    if (regVersion != null)
    {
    regIconString
    = regVersion.GetValue("") as string;
    regVersion.Close();
    }
    }
    if (regIconString == null)
    {
    //没有读取到文件类型注册信息,指定为未知文件类型的图标
    regIconString = systemDirectory + "shell32.dll,0";
    }
    }
    else
    {
    //直接指定为文件夹图标
    regIconString = systemDirectory + "shell32.dll,3";
    }
    string[] fileIcon = regIconString.Split(new char[] { ',' });
    if (fileIcon.Length != 2)
    {
    //系统注册表中注册的标图不能直接提取,则返回可执行文件的通用图标
    fileIcon = new string[] { systemDirectory + "shell32.dll", "2" };
    }
    Icon resultIcon
    = null;
    try
    {
    //调用API方法读取图标
    int[] phiconLarge = new int[1];
    int[] phiconSmall = new int[1];
    uint count = Win32.ExtractIconEx(fileIcon[0], Int32.Parse(fileIcon[1]), phiconLarge, phiconSmall, 1);
    IntPtr IconHnd
    = new IntPtr(isLarge ? phiconLarge[0] : phiconSmall[0]);
    resultIcon
    = Icon.FromHandle(IconHnd);
    }
    catch { }
    return resultIcon;
    }
    }



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

    ///
    /// 定义调用的API方法
    ///
    class Win32
    {
    public const uint SHGFI_ICON = 0x100;
    public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
    public const uint SHGFI_SMALLICON = 0x1; // 'Small icon

    [DllImport(
    "shell32.dll")]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
    [DllImport(
    "shell32.dll")]
    public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

    }
    }
  • 相关阅读:
    20182318 2019-2020-1 《数据结构与面向对象程序设计》第2和3周学习总结
    20182318 2019-2020-1 《数据结构与面向对象程序设计》实验二报告
    实验一
    第一周作业
    20182318预备作业:课程基础
    WEB前端第五十八课——PDO预处理、PDO事务处理
    WEB前端第五十七课——单例模式、PDO、singleton获取PDO、PDO操作DB、PDO异常捕获
    WEB前端第五十六课——MySQL、前后台交互
    WEB前端第五十五课——jQueryAjax请求
    WEB前端第五十四课——PHP基础⑵流程控制、类和对象、常量和变量、构造函数、继承
  • 原文地址:https://www.cnblogs.com/dabaopku/p/1672068.html
Copyright © 2011-2022 走看看