• 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);

    }
    }
  • 相关阅读:
    Android源码学习之如何使用eclipse+NDK
    Android NDK 工具链的使用方法(Standalone Toolchain)
    gcc和g++的区别
    OCP-1Z0-051-V9.02-42题
    OCP-1Z0-051-V9.02-41题
    OCP-1Z0-051-V9.02-40题
    OCP-1Z0-051-V9.02-39题
    windows下自动生成文件夹下所有JNI所需的.h头文件
    OCP-1Z0-051-V9.02-38题
    Oracle DB 视图
  • 原文地址:https://www.cnblogs.com/dabaopku/p/1672068.html
Copyright © 2020-2023  润新知