admin管理员组文章数量:1566355
2024年7月22日发(作者:)
使用前说明:
PS:
如果您想正常使用该类,需要在添加一个资源文件(如果是Win Form项目,该文件已
存在),然后在资源文件中添加五个图标ICON元素,用于充当默认图标。命名为:Application、CDDriver、
Empty、Folder、HardDriver。如下图所示:
← 资源文件
PPS:
每个图标文件均包括48*48,32*32和16*16三种像素大小。如果您使用VS2008自带的图标库中的图标,
则自动包含这三种像素大小(本例所使用的图标即是取自该库)。
PPPS:
VS2008的默认路径为(如果您安装VS2008时选择安装该图标库的话):C:Program FilesMicrosoft
Visual Studio 9.0Common7VS2008ImageLibrary2052。
位于该路径下的一个压缩文件
素。
包含几乎所有的系统图标元
PPPPS:
如果你确定不需要使用默认图标,请将静态构造函数注释。但此时程序有可能返回空的图标对象
null,
/* 该类是从最近编写的一个FTP软件中抽取出来的。
* 该类基础原型来自网络,经过大量的修改和注释添加才得以完成,其中SHFileInfoFlags枚举值注释
* 是从英文文档逐个翻译的,由于本人英语水平有限,难免有翻译不当之处,敬请谅解。
* 类中各函数作用请参见注释。
*
* 使用时请您尊重他人的劳动成果,如果您需要分享该文档,请务必使用免费方式分享。
*
* 因为最近发现有人将我文库的文档分享到自己的文库、空间、CSDN上面,而且提供索要积分的方式下载
//于北京海淀区东升科技园内 3/9/2012 YJWang
using System;
using pServices;
using g;
using ;
namespace FTPComponent
{
///
/// 获取系统文件图标,Designed by YJWang 2/20/2012
///
public class SystemIcon
{
#region 【内部类型定义】
#region 【Enums】
///
/// 文件信息标识枚举类,所有枚举定义值前省略SHGFI投标,比如Icon 完整名称应为SHGFI_ICON
///
[Flags]
private enum SHFileInfoFlags : uint
{
///
/// 允许有叠加图案的文件图标,该标识必须和Icon同时使用
///
AddOveylays = 0x20,
///
/// 只获取由参数FileAttribute指定的文件信息,并将其写入SHFileInfo结构的dwAttributes属性,
如果不指定该标识,将同时获取所有文件信息。该标志不能和Icon标识同时使用
* 关键是我在百度搜关键词,竟然搜不到我自己的,只搜到别人的,气愤ing o(╯□╰)o
*/
///
Attr_Specified = 0x20000,
///
/// 将获取的文件属性复制到SHFileInfo结构的dwAttributes属性中
///
Attributes = 0x800,
///
/// 获取文件的显示名称(长文件名称),将其复制到SHFileInfo结构的dwAttributes属性中
///
DisplayName = 0x200,
///
/// 如果文件是可执行文件,将检索其信息,并将信息作为返回值返回
///
ExeType = 0x2000,
///
/// 获得图标和索引,将图标句柄返回到SHFileInfo结构的hIcon属性中,索引返回到iIcon属性中
///
Icon = 0x100,
///
/// 检索包含图标的文件,并将文件名,图标句柄,图标索引号,放回到SHFileInfo结构中
///
IconLocation = 0x1000,
///
/// 获得大图标,该标识必须和Icon标识同时使用
///
LargeIcon = 0x0,
///
/// 获取链接覆盖文件图标,该标识必须和Icon标识同时使用。
///
LinkOverlay = 0x8000,
///
/// 获取文件打开时的图标,该标识必须和Icon或SysIconIndex同时使用
///
OpenIcon = 0x2,
///
/// 获取链接覆盖文件图标索引,该标识必须和Icon标识同时使用。
///
OverlayIndex = 0x40,
///
/// 指示传入的路径是一个ITEMIDLIST结构的文件地址而不是一个路径名。
///
Pidl = 0x8,
///
/// 获取系统的高亮显示图标,该标识必须和Icon标识同时使用。
///
Selected = 0x10000,
///
/// 获取 Shell-sized icon ,该标志必须和Icon标识同时使用。
///
ShellIconSize = 0x4,
///
/// 获得小图标,该标识必须和Icon或SysIconIndex同时使用。
///
SmallIcon = 0x1,
///
/// 获取系统图像列表图标索引,返回系统图像列表句柄
///
SysIconIndex = 0x4000,
///
/// 获得文件类型,类型字符串被写入SHFileInfo结构的szTypeName属性中
///
TypeName = 0x400,
///
/// 指示如果由pszPath指定的路径不存在,SHGetFileInfo方法变不会试图去操作文件。指示返回与
文件类型相关的信息。该标识不能和Attributes、ExeType和Pidl同时使用
///
UseFileAttributes = 0x10
}
///
/// 文件属性枚举
///
[Flags]
private enum FileAttribute
{
ReadOnly = 0x00000001,
Hidden = 0x00000002,
System = 0x00000004,
Directory = 0x00000010, //路径信息
Archive = 0x00000020,
Device = 0x00000040,
Normal = 0x00000080, //普通文件信息
Temporary = 0x00000100,
Sparse_File = 0x00000200,
Reparse_Point = 0x00000400,
Compressed = 0x00000800,
Offline = 0x00001000,
Not_Content_Indexed = 0x00002000,
Encrypted = 0x00004000
}
#endregion 【Enums】
#region 【FileStruct】
///
/// 定义返回的文件信息结构
///
[StructLayout(tial, CharSet = )]
private struct SHFileInfo
{
///
/// 文件的图标句柄
///
public IntPtr hIcon;
///
/// 图标的系统索引号
///
public IntPtr iIcon;
///
/// 文件的属性值,由FileAttribute指定的属性。
///
public uint dwAttributes;
///
/// 文件的显示名,如果是64位系统,您可能需要制定SizeConst=258而非260才能够显示完整的
TypeName
///
[MarshalAs(Str, SizeConst = 260)]
public string szDisplayName;
///
/// 文件的类型名
///
[MarshalAs(Str, SizeConst = 80)]
public string szTypeName;
}
#endregion 【FileStruct】
#endregion 【内部类型定义】
#region 【DLLImport】
///
/// 引用shell32文件的SHGetFileInfo API方法
///
/// 指定的文件名
/// 文件属性
/// 返回获得的文件信息,是一个记录类型
/// 文件的类型名
/// 文件信息标识
///
[DllImport("shell32", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = ,
SetLastError = true)]
private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref
SHFileInfo sfi, int cbFileInfo, SHFileInfoFlags uFlags);
#endregion 【DLLImport】
#region 【静态字段定义】
private static Icon _folderIcon; //文件夹图标
private static Icon _emptyIcon; //空白文件图标
private static Icon _hardDriverIcon; //本地磁盘图标
private static Icon _CDDriverIcon; //本地光驱图标
private static Icon _applicationIcon; //应用程序图标
///
/// 当读取文件图标失败的默认图标索引号
///
public static readonly long ErrorFileIndex = -2;
///
/// 当读取文件夹图标失败的默认图标索引号
///
public static readonly long ErrorFolderIndex = -4;
///
/// 当读取磁盘驱动器图标失败的默认图标索引号
///
public static readonly long ErrorDriverIndex = -8;
///
/// 当读取可执行文件图标失败的默认图标索引号
///
public static readonly long ErrorApplicationIndex = -16;
#endregion 【静态字段定义】
#region 【静态属性】
///
/// 获取 封装的文件夹大图标
///
public static Icon FolderIconLarge
{
get
{
try
{
return new Icon(SystemIcon._folderIcon, new Size(32, 32));
}
catch { return SystemIcon._folderIcon; }
}
}
///
/// 获取 封装的文件夹小图标
///
public static Icon FolderIconSmall
{
get
{
try
{
return new Icon(SystemIcon._folderIcon, new Size(16, 16));
}
catch { return SystemIcon._folderIcon; }
}
}
///
/// 获取 封装的未知文件大图标
///
public static Icon EmptyIconLarge
{
get
{
try
{
return new Icon(SystemIcon._emptyIcon, new Size(32, 32));
}
catch { return SystemIcon._emptyIcon; }
}
}
///
/// 获取 封装的未知文件小图标
///
public static Icon EmptyIconSmall
{
get
{
try
{
return new Icon(SystemIcon._emptyIcon, new Size(16, 16));
}
catch { return SystemIcon._emptyIcon; }
}
}
///
/// 获取 封装的本地磁盘大图标
///
public static Icon HardDriverIconLarge
{
get
{
try
{
return new Icon(SystemIcon._hardDriverIcon, new Size(32, 32));
}
catch { return SystemIcon._hardDriverIcon; }
}
}
///
/// 获取 封装的本地磁盘小图标
///
public static Icon HardDriverIconSmall
{
get
{
try
{
return new Icon(SystemIcon._hardDriverIcon, new Size(16, 16));
}
catch { return SystemIcon._hardDriverIcon; }
}
}
///
/// 获取 封装的本地光驱大图标
///
public static Icon CDDriverIconLarge
{
get
{
try
{
return new Icon(SystemIcon._CDDriverIcon, new Size(32, 32));
}
catch { return SystemIcon._CDDriverIcon; }
}
}
///
/// 获取 封装的本地光驱小图标
///
public static Icon CDDriverIconSmall
{
get
{
try
{
return new Icon(SystemIcon._CDDriverIcon, new Size(16, 16));
}
catch { return SystemIcon._CDDriverIcon; }
}
}
///
/// 获取 封装的应用程序大图标,一般指exe文件
///
public static Icon ApplicationIconLarge
{
get
{
try
{
return new Icon(SystemIcon._applicationIcon, new Size(32, 32));
}
catch { return SystemIcon._applicationIcon; }
}
}
///
/// 获取 封装的应用程序小图标,一般指exe文件
///
public static Icon ApplicationIconSmall
{
get
{
try
{
return new Icon(SystemIcon._applicationIcon, new Size(16, 16));
}
catch { return SystemIcon._applicationIcon; }
}
}
#endregion 【静态属性】
#region 【静态构造函数】
///
/// 静态构造函数,初始化静态变量,不能确定该构造函数在何时执行
///
static SystemIcon()
{
_folderIcon = ;
_emptyIcon = ;
_hardDriverIcon = iver;
_CDDriverIcon = er;
_applicationIcon = ation;
}
#endregion 【静态构造函数】
#region 【公共方法】
#region 【获取文件图标】
///
/// 获取系统文件图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)
/// 标识是获取小图标还是获取大图标
///
public static Icon GetFileIcon(string fileName, bool smallIcon)
{
long lValue;
return GetFileIcon(fileName, smallIcon, out lValue);
}
///
/// 获取系统文件图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)
/// 标识是获取小图标还是获取大图标
/// 输出与返回图标对应的系统图标索引号
///
public static Icon GetFileIcon(string fileName, bool smallIcon, out long imageIndex)
{
if (fileName == null)
{
imageIndex = ErrorFileIndex;
return _emptyIcon;
}
try
{
SHFileInfoFlags uFlags = | conSize;
if (smallIcon)
uFlags |= con;
else
uFlags |= con;
FileInfo fi = new FileInfo(fileName);
if (r().EndsWith(".EXE"))
uFlags |= e;
else
uFlags |= eAttributes;
Icon ic = GetIcon(fileName, , uFlags, out imageIndex);
if (imageIndex == ErrorFileIndex)
{
//是否是exe文件
if (r().EndsWith(".EXE"))
{
imageIndex = ErrorApplicationIndex;
ic = smallIcon ? ApplicationIconSmall : ApplicationIconLarge;
}
else
ic = smallIcon ? EmptyIconSmall : EmptyIconLarge;
}
return ic;
}
catch
{
imageIndex = ErrorFileIndex;
return _emptyIcon;
}
}
///
/// 获取系统图标索引
///
/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)
///
public static long GetFileImageIndex(string fileName)
{
if (fileName == null)
{
return ErrorFileIndex;
}
try
{
SHFileInfoFlags uFlags = | conSize |
con;
FileInfo fi = new FileInfo(fileName);
if (r().EndsWith(".EXE"))
uFlags |= e;
else
uFlags |= eAttributes;
long lValue = GetIndex(fileName, , uFlags);
if (lValue == ErrorFileIndex)
{
//是否是exe文件
if (r().EndsWith(".EXE"))
lValue = ErrorApplicationIndex;
}
return lValue;
}
catch
{
return ErrorFileIndex;
}
}
#endregion 【获取文件图标】
#region 【获取文件夹图标】
///
/// 获取系统默认的文件夹图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 标识是获取小图标还是获取大图标
///
public static Icon GetFolderIcon(bool smallIcon)
{
long lValue;
return GetFolderIcon(Directory, smallIcon, out lValue);
}
///
/// 获取自定义的文件夹图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 文件夹名称,如果想获取自定义文件夹图标,请指定完整的文件夹名称(如
F:test)
/// 标识是获取小图标还是获取大图标
/// 输出与返回图标对应的系统图标索引号
///
public static Icon GetFolderIcon(string fileName, bool smallIcon, out long imageIndex)
{
if (fileName == null)
{
imageIndex = ErrorFolderIndex;
return _folderIcon;
}
SHFileInfoFlags uFlags = | conSize |
eAttributes;
if (smallIcon)
uFlags |= con;
else
uFlags |= con;
Icon ic = GetIcon(fileName, ory, uFlags, out imageIndex);
if (imageIndex < 0)
ic = smallIcon ? FolderIconSmall : FolderIconLarge;
return ic;
}
///
/// 获取系统图标索引
///
/// 文件夹名称,如果想获取自定义文件夹图标索引号,请指定完整的文件夹名
称(如 F:test)
///
public static long GetFolderImageIndex(string fileName)
{
if (fileName == null)
{
return ErrorFolderIndex;
}
return GetIndex(fileName, ory,
| conSize
| con
| eAttributes);
}
#endregion 【获取文件夹图标】
#region 【获取磁盘驱动器图标】
///
/// 获取磁盘驱动器图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 有效的磁盘标号,如C、D、I等等,不区分大小写
/// 标识是获取小图标还是获取大图标
///
public static Icon GetDriverIcon(char driverMark, bool smallIcon)
{
long lValue;
return GetDriverIcon(driverMark, smallIcon, out lValue);
}
///
/// 获取磁盘驱动器图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 有效的磁盘标号,如C、D、I等等,不区分大小写
/// 标识是获取小图标还是获取大图标
/// 输出与返回图标对应的系统图标索引号
///
public static Icon GetDriverIcon(char driverMark, bool smallIcon, out long imageIndex)
{
//非有效盘符,返回封装的磁盘图标
if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')
{
imageIndex = ErrorDriverIndex;
return _hardDriverIcon;
}
string driverName = ng().ToUpper() + ":";
SHFileInfoFlags uFlags = | conSize |
eAttributes;
if (smallIcon)
uFlags |= con;
else
uFlags |= con;
Icon ic = GetIcon(driverName, , uFlags, out imageIndex);
if (imageIndex == ErrorFileIndex)
{
imageIndex = ErrorDriverIndex;
ic = smallIcon ? HardDriverIconSmall : HardDriverIconLarge;
}
return ic;
}
///
/// 获取系统图标索引
///
/// 文件夹名称,如果想获取自定义文件夹图标索引号,请指定完整的文件夹名
称(如 F:test)
///
public static long GetDriverImageIndex(char driverMark)
{
//非有效盘符,返回封装的磁盘图标
if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')
{
return ErrorDriverIndex;
}
string driverName = ng().ToUpper() + ":";
long lValue = GetIndex(driverName, ,
| conSize
| con
|
eAttributes);
if (lValue == ErrorFileIndex)
{
lValue = ErrorDriverIndex;
}
return lValue;
}
#endregion 【获取磁盘驱动器图标】
#region 【获取文件类型】
///
/// 获取指定文件的类型描述
///
/// 文件名
///
public static string GetTypeName(string fileName)
{
string typeName = GetTypeName(fileName, ,
eAttributes | me | yName);
if (OrEmpty(typeName))
return "";
else
return ();
}
#endregion 【获取文件类型】
#endregion 【公共方法】
#region 【私有方法】
///
/// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
///
/// 文件名或路径名
/// 文件信息
/// 信息控制字
/// 输出与返回图标对应的系统图标索引号
///
private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long
imageIndex)
{
try
{
SHFileInfo fi = new SHFileInfo();
Icon ic = null;
int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);
ic = ndle();
imageIndex = 64(); //设置图标索引号
return ic;
}
catch (Exception ex)
{
if (dwAttr == ory)
{
imageIndex = ErrorFolderIndex;
return _folderIcon;
}
else
{
imageIndex = ErrorFileIndex;
return _emptyIcon;
}
}
}
///
/// 获取系统图标索引号
///
/// 文件名或路径名
/// 文件信息
/// 信息控制字
///
private static long GetIndex(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)
{
try
{
SHFileInfo fi = new SHFileInfo();
int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);
return 64();
}
catch (Exception ex)
{
if (dwAttr == ory)
return ErrorFolderIndex;
else
return ErrorFileIndex;
}
}
///
/// 获取文件类型
///
/// 文件名
/// 文件信息
/// 信息控制字
///
private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)
{
try
{
SHFileInfo fi = new SHFileInfo();
int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);
return Name;
}
catch
{
return "";
}
}
#endregion 【私有方法】
}
}
版权声明:本文标题:C# 获取系统文件图标 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1721604107a887709.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论