c# 获取系统文件图标

简介: 最近写一个小程序,需要获得启动项的信息,在读取启动程序图标时遇到了这个问题 我们知道在c#里添加图标最常用的方法是使用ImageList,但要读取的程序图标是动态的,那么就需要动态的获得文件的图标 在网上找了找,发现有一个类,直接使用就可以了 贴出来和大家共享,本人在写一个类似于360safe的东西,不过软件增加了更多的个人色彩,希望大家能多多交流!showSystemIcon.
最近写一个小程序,需要获得启动项的信息,在读取启动程序图标时遇到了这个问题
我们知道在c#里添加图标最常用的方法是使用ImageList,但要读取的程序图标是动态的,那么就需要动态的获得文件的图标
在网上找了找,发现有一个类,直接使用就可以了
贴出来和大家共享,本人在写一个类似于360safe的东西,不过软件增加了更多的个人色彩,希望大家能多多交流!

showSystemIcon.cs
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.ComponentModel;
 4 using  System.Data;
 5 using  System.Drawing;
 6 using  System.Text;
 7 using  System.Windows.Forms;
 8 using  System.Runtime.InteropServices;
 9
10 namespace  RepairTools_2._0
11 {
12    class showSystemIcon
13    {
14        public static uint SHGFI_ICON = 0x100;
15        public static uint SHGFI_DISPLAYNAME = 0x200;
16        public static uint SHGFI_TYPENAME = 0x400;
17        public static uint SHGFI_ATTRIBUTES = 0x800;
18        public static uint SHGFI_ICONLOCATION = 0x1000;
19        public static uint SHGFI_EXETYPE = 0x2000;
20        public static uint SHGFI_SYSICONINDEX = 0x4000;
21        public static uint SHGFI_LINKOVERLAY = 0x8000;
22        public static uint SHGFI_SELECTED = 0x10000;
23        public static uint SHGFI_LARGEICON = 0x0;
24        public static uint SHGFI_SMALLICON = 0x1;
25        public static uint SHGFI_OPENICON = 0x2;
26        public static uint SHGFI_SHELLICONSIZE = 0x4;
27        public static uint SHGFI_PIDL = 0x8;
28        public static uint SHGFI_USEFILEATTRIBUTES = 0x10;
29
30        public static uint FILE_ATTRIBUTE_NORMAL = 0x80;
31        public static uint LVM_FIRST = 0x1000;
32        public static uint LVM_SETIMAGELIST = LVM_FIRST + 3;
33        public static uint LVSIL_NORMAL = 0;
34        public static uint LVSIL_SMALL = 1;
35
36        [DllImport("Shell32.dll")]
37        public static extern IntPtr SHGetFileInfo(string pszPath,
38            uint dwFileAttributes, ref SHFILEINFO psfi,
39            int cbfileInfo, uint uFlags);
40
41        public struct SHFILEINFO
42        {
43            public IntPtr hIcon;
44            public int iIcon;
45            public int dwAttributes;
46            public string szDisplayName;
47            public string szTypeName;
48        }

49
50        [DllImport("User32.DLL")]
51        public static extern int SendMessage(IntPtr hWnd,
52            uint Msg, IntPtr wParam, IntPtr lParam);
53
54        public void ListViewSysImages(ListView AListView)
55        {
56            SHFILEINFO vFileInfo = new SHFILEINFO();
57            IntPtr vImageList = SHGetFileInfo(""0ref vFileInfo,
58                Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE |
59                SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
60
61            SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_NORMAL,
62                vImageList);
63
64            vImageList = SHGetFileInfo(""0ref vFileInfo,
65                Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE |
66                SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
67            SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_SMALL,
68                vImageList);
69        }

70
71        public int FileIconIndex(string AFileName)
72        {
73            SHFILEINFO vFileInfo = new SHFILEINFO();
74            SHGetFileInfo(AFileName, 0ref vFileInfo,
75                Marshal.SizeOf(vFileInfo), SHGFI_SYSICONINDEX);
76            return vFileInfo.iIcon;
77        }

78    }

79}

80

使用:
把它添加到ListView中
 1 private   void  btnRunSearch_Click( object  sender, EventArgs e)
 2          {
 3            try
 4            {
 5                ListViewItem lvi;
 6                ListViewItem.ListViewSubItem lvsi;
 7                showSystemIcon showIcon = new showSystemIcon();
 8
 9                this.lvStartupFileList.Items.Clear();
10                lvStartupFileList.BeginUpdate();
11                foreach (string str in RegistryOperate.strRunRegistry())
12                {
13                    string str1 = RegistryOperate.returnRun().GetValue(str).ToString();
14                    showIcon.ListViewSysImages(lvStartupFileList);
15                    lvi = new ListViewItem();
16                    lvi.Text = str;
17                    lvi.ImageIndex = showIcon.FileIconIndex(str1);
18                    lvsi = new ListViewItem.ListViewSubItem();
19                    lvsi.Text = str1;
20                    lvi.SubItems.Add(lvsi);
21                    lvStartupFileList.Items.Add(lvi);
22                }

23                lvStartupFileList.EndUpdate();
24            }

25            catch
26            {
27                MessageBox.Show(e.ToString());
28            }

29        }


有什么问题大家交流交流吧!


作者:Parry
出处:http://www.cnblogs.com/parry/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章
|
1月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
94 19
|
1月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
74 2
|
2月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
PACS源码,C#语言数字医学影像系统成品源码
|
1月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
21 3
|
1月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
1月前
|
C#
C# 写日志文件
C# 写日志文件
38 0
|
3月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
66 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
2月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
30 0
|
2月前
|
C#
C#中使用IntPtr.Size属性来判断当前系统是32位还是64位
这段代码首先检查 `IntPtr.Size`的值,如果是4,则输出"当前系统是32位";如果是8,则输出"当前系统是64位";如果都不是,就输出"未知系统位数"。
34 0
|
3月前
|
C#
【C#】C#读写Excel文件
【C#】C#读写Excel文件
55 1