C# 获取系统Icon、获取文件相关的Icon

原文:C# 获取系统Icon、获取文件相关的Icon

1、获取系统Icon工具下载SystemIcon.exe

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FileExplorer
{
    /// <summary>
    /// 系统Icon
    /// 1、Get()  获取指定索引对应的系统icon
    /// 2、Save() 保存所有系统图像
    /// 3、Show() 显示所有系统Icon图像
    /// </summary>
    public partial class SystemIcon : Form
    {
        public SystemIcon()
        {
            InitializeComponent();

            Show(this);
            Save();
        }

        /// <summary>
        /// 在form上显示所有系统icon图像
        /// </summary>
        public static void Show(Form form)
        {
            LoadSystemIcon();

            FlowLayoutPanel flowLayout = new FlowLayoutPanel();
            flowLayout.Dock = System.Windows.Forms.DockStyle.Fill;
            flowLayout.AutoScroll = true;

            for (int i = 0; i < SystemIconList.Count; i++)
            {
                PictureBox pic = new PictureBox();
                pic.Size = new System.Drawing.Size(32, 32);
                flowLayout.Controls.Add(pic);

                Bitmap p = SystemIconList[i].ToBitmap();
                pic.Image = p;
            }
            form.Controls.Add(flowLayout);
        }

        /// <summary>
        /// 保存所有系统图像
        /// </summary>
        public static void Save()
        {
            LoadSystemIcon();

            for (int i = 0; i < SystemIconList.Count; i++)
            {
                Bitmap p = SystemIconList[i].ToBitmap();

                // 保存图像
                string path = AppDomain.CurrentDomain.BaseDirectory + "系统图标\\";
                string filepath = path + (i + ".png");
                if (!Directory.Exists(path)) Directory.CreateDirectory(path);
                if (!File.Exists(filepath)) p.Save(filepath);
            }
        }

        /// <summary>
        /// 获取指定索引对应的系统icon
        /// </summary>
        public static Icon Get(int index)
        {
            LoadSystemIcon();
            return index < SystemIconList.Count ? SystemIconList[index] : null;
        }

        private static List<Icon> SystemIconList = new List<Icon>(); // 记录系统图标

        //[DllImport("user32.dll", CharSet = CharSet.Auto)]
        //private static extern bool MessageBeep(uint type);

        [DllImport("Shell32.dll")]
        public extern static int ExtractIconEx(string libName, int iconIndex, IntPtr[] largeIcon, IntPtr[] smallIcon, int nIcons);

        private static IntPtr[] largeIcon;
        private static IntPtr[] smallIcon;

        /// <summary>
        /// 获取所有系统icon图像
        /// </summary>
        private static void LoadSystemIcon()
        {
            if (SystemIconList.Count > 0) return;

            largeIcon = new IntPtr[1000];
            smallIcon = new IntPtr[1000];

            ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 1000);

            SystemIconList.Clear();
            for (int i = 0; i < largeIcon.Length; i++)
            {
                try
                {
                    Icon ic = Icon.FromHandle(largeIcon[i]);
                    SystemIconList.Add(ic);
                }
                catch (Exception ex)
                {
                    break;
                }
            }
        }

        //private void LoadSystemIcon()
        //{
        //    largeIcon = new IntPtr[1000];
        //    smallIcon = new IntPtr[1000];

        //    ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 1000);

        //    FlowLayoutPanel flowLayout = new FlowLayoutPanel();
        //    flowLayout.Dock = System.Windows.Forms.DockStyle.Fill;
        //    flowLayout.AutoScroll = true;

        //    for (int i = 0; i < largeIcon.Length; i++)
        //    {
        //        try
        //        {
        //            PictureBox pic = new PictureBox();
        //            pic.Size = new System.Drawing.Size(32, 32);
        //            flowLayout.Controls.Add(pic);

        //            Icon ic = Icon.FromHandle(largeIcon[i]);
        //            SystemIcon.Add(ic);

        //            Bitmap p = ic.ToBitmap();
        //            pic.Image = p;

        //            // 保存图像
        //            string path = AppDomain.CurrentDomain.BaseDirectory + "系统图标\\";
        //            string filepath = path + (i + ".png");
        //            if (!Directory.Exists(path)) Directory.CreateDirectory(path);
        //            if (!File.Exists(filepath)) p.Save(filepath);
        //        }
        //        catch (Exception ex)
        //        {
        //            break;
        //        }
        //    }
        //    this.Controls.Add(flowLayout);
        //}
    }
}

  

2、获取文件相关的Icon

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using Microsoft.Win32;

namespace FileExplorer
{
    /// <summary>
    /// 获取指定文件的Icon图像getIcon()、getIcon2()
    /// </summary>
    class FileIcon
    {
        private const uint SHGFI_ICON = 0x100;
        private const uint SHGFI_LARGEICON = 0x0;  //大图标
        private const uint SHGFI_SMALLICON = 0x1;  //小图标

        [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;   //文件的类型名
        };

        [DllImport("shell32.dll")]
        private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

        /// <summary>
        /// 获取文件FilePath对应的Icon
        /// </summary>
        public static Icon getIcon(string FilePath)
        {
            SHFILEINFO shinfo = new SHFILEINFO();
            //FileInfo info = new FileInfo(FileName);

            //大图标
            SHGetFileInfo(FilePath, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON);
            Icon largeIcon = Icon.FromHandle(shinfo.hIcon);

            //Icon.ExtractAssociatedIcon(FileName);
            return largeIcon;
        }

        /// <summary>
        /// 获取文件FilePath对应的Icon
        /// </summary>
        public static Icon getIcon2(string FilePath)
        {
            return Icon.ExtractAssociatedIcon(FilePath);
        }
    }
}

  

原文地址:https://www.cnblogs.com/lonelyxmas/p/9496588.html

时间: 2024-10-03 18:12:26

C# 获取系统Icon、获取文件相关的Icon的相关文章

获取系统时间&amp;&amp;获取程序某一段执行时间

获取系统时间: CTime  _time; CString m_SystemTime("");  _time=CTime::GetCurrentTime();  m_SystemTime=_time.Format("%Y-%m-%d  %H:%M:%S"); 获取程序某一段执行时间: DWORD  betime(0),endtime(0),sumtime(0); int i=0; betime=GetTickCount(); while(i<10) {  Sl

QT5获取系统文件图标,文件路径

获取系统图标: QFileIconProvider icon_provider; QIcon icon = icon_provider.icon(QFileIconProvider::Folder); 其中可以获取的系统图标有: Constant Value QFileIconProvider::Computer 0 QFileIconProvider::Desktop 1 QFileIconProvider::Trashcan 2 QFileIconProvider::Network 3 QF

利用stat命令获取Linux文件系统和文件的详细状态信息

用途:stat命令用于显示文件或文件系统的状态信息,来自于coreutils软件包,一般系统自带此命令工具,它能获取与文件系统及文件相关的许多信息,具体用途见stat的功能选项.这些信息包括inode.atime.ctime.mtime.文件(系统)类型.权限.块大小.符号连接等. 语法:stat [OPTION]... FILE... , 可通过stat --help或man stat获取它的帮助信息 功能选项:功能选项需要结合-c参数使用,如利用stat获取文件的inode信息,则使用sta

根据文件扩展名获取系统图标

1 /// <summary> 2 /// 根据文件后缀名获取系统图标. 3 /// </summary> 4 /// <param name="extension"></param> 5 /// <returns></returns> 6 public static ImageSource GetIconByExtension(string extension) 7 { 8 Icon smallIcon = nu

Java中获取系统相关信息——sigar

一.sigar简介 sigar中文名是系统信息收集和报表工具,是一个开源的工具,提供了跨平台的系统信息收集的API,可以和绝大多数操作系统和大多数版本打交道,可以收集的信息包括: 1.操作系统的信息,包括:dataModel.cpuEndian.name.version.arch.machine.description.patchLevel.vendor.vendorVersion.vendorName.vendorCodeName 2.CPU信息,包括:基本信息(vendor.model.mh

关于获取系统特殊文件夹的方法

一.获取当前文件的路径1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName     获取模块的完整路径,包括文件名.2.   System.Environment.CurrentDirectory     获取和设置当前目录(该进程从中启动的目录)的完全限定目录.3.   System.IO.Directory.GetCurrentDirectory()     获取应用程序的当前工作目录.这个不一定是程序

System.getProperty()获取系统的相关属性

我们在编程的过程中有时候需要获取系统的相关属性,今天就让我们一起来学习学习如何获取系统的相关属性 至于System.getProperty(param)中的各个参数的概念请看下表. java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟机规范版本 java.vm.specif

Linux sysinfo获取系统相关信息

Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <linux/unistd.h> /* for _syscallX macros/related stuff */ #include <linux/kernel.h> /* for struct sysinfo */ //_syscall1(int, sysi

获取系统特殊文件夹路径信息

//获取系统特殊文件夹路径信息 try {   this.textBox1.Text=Environment.GetFolderPath(System.Environment.SpecialFolder.System);   this.textBox2.Text=Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);   this.textBox3.Text=Environment.GetFolderPa