非常感谢您光临『51海派博客』。51海派是一个以.NET 为开发平台的软件开发网站,本站提倡原创作品、高质量源码与论文,并无私奉献出控件源码。发布本站开发的所有软件为广大用户免费使用。并为有独特构思的用户免费开发定制性的软件以及控件。希望大家多多支持。本站内容遵从创作共同协议,如果转载请注明本站网址! 本站QQ群号:104677756 ,一起来交流吧!
C# OpenAPI API 通过 文件图标
作者:ufo1199078 日期:2009-09-24
在C#中要获取各种文件的图标,可以通过API调用来完成。主要的函数是SHGetFileInfo.在C#中操作的方式如下 :
第一步:准备SHGetFileInfo需要的各种参数
1.FileInfoStruct
程序代码
[StructLayout( LayoutKind.Sequential)]
public struct FileInfoStruct
...{
public IntPtr hIcon;
public int iIcon;
public int dwAttributes;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 )]
public string szDisplayName;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 80 )]
public string szTypeName;
} 2.FileInfoFlags
public enum FileInfoFlags : int
...{
SHGFI_ICON = 0x000000100 , // get icon
SHGFI_DISPLAYNAME = 0x000000200 , // get display name
SHGFI_TYPENAME = 0x000000400 , // get type name
SHGFI_ATTRIBUTES = 0x000000800 , // get attributes
SHGFI_ICONLOCATION = 0x000001000 , // get icon location
SHGFI_EXETYPE = 0x000002000 , // return exe type
SHGFI_SYSICONINDEX = 0x000004000 , // get system icon index
SHGFI_LINKOVERLAY = 0x000008000 , // put a link overlay on icon SHGFI_SelectED = 0x000010000 , // show icon in selected state
SHGFI_ATTR_SPECIFIED = 0x000020000 , // get only specified attributes
SHGFI_LARGEICON = 0x000000000 , // get large icon
SHGFI_SMALLICON = 0x000000001 , // get small icon
SHGFI_OPENICON = 0x000000002 , // get open icon
SHGFI_SHELLICONSIZE = 0x000000004 , // get shell size icon
SHGFI_PIDL = 0x000000008 , // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES = 0x000000010 , // use passed dwFileAttribute
SHGFI_ADDOVERLAYS = 0x000000020 , // apply the appropriate overlays
SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay
} 3.FileAttributeFlags(这个.net中好像已经有了)
public enum FileAttributeFlags : int
...{
FILE_ATTRIBUTE_READONLY = 0x00000001 ,
FILE_ATTRIBUTE_HIDDEN = 0x00000002 ,
FILE_ATTRIBUTE_SYSTEM = 0x00000004 ,
FILE_ATTRIBUTE_DIRECTORY = 0x00000010 ,
FILE_ATTRIBUTE_ARCHIVE = 0x00000020 ,
FILE_ATTRIBUTE_DEVICE = 0x00000040 ,
FILE_ATTRIBUTE_NORMAL = 0x00000080 ,
FILE_ATTRIBUTE_TEMPORARY = 0x00000100 ,
FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200 ,
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 ,
FILE_ATTRIBUTE_COMPRESSED = 0x00000800 ,
FILE_ATTRIBUTE_OFFLINE = 0x00001000 ,
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000 ,
FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
}
然后 开始准备调用SHELL API了 :
程序代码
[DllImport("shell32.dll " , EntryPoint ="SHGetFileInfo")]
public static extern int GetFileInfo( string pszPath, int dwFileAttributes,
ref FileInfoStruct psfi, int cbFileInfo, int uFlags);
好了现在一切都准备好了 我们现在通过下面的两个方法来获取图标
程序代码
public static Icon GetLargeIcon(string pFilePath)
...{
FileInfoStruct _info = new FileInfoStruct();
Win32API.GetFileInfo(pFilePath, 0 , ref _info, Marshal.SizeOf(_info),
( int )(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_LARGEICON));
try
... catch
...{
return null ;
}
}
public static Icon GetSmallIcon(string pFilePath)
...{
FileInfoStruct _info = new FileInfoStruct();
Win32API.GetFileInfo(pFilePath, 0 , ref _info, Marshal.SizeOf(_info),
( int )(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_SMALLICON));
try
...
catch
...{
return null ;
}
}
呵呵 工作就做完了。但是我发现这样取出来的Icon在TreeView 中显示的时候特别难看。但是目前也没有什么好方法。毕竟图标太多了。
第一步:准备SHGetFileInfo需要的各种参数
1.FileInfoStruct
程序代码[StructLayout( LayoutKind.Sequential)]
public struct FileInfoStruct
...{
public IntPtr hIcon;
public int iIcon;
public int dwAttributes;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 )]
public string szDisplayName;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst = 80 )]
public string szTypeName;
} 2.FileInfoFlags
public enum FileInfoFlags : int
...{
SHGFI_ICON = 0x000000100 , // get icon
SHGFI_DISPLAYNAME = 0x000000200 , // get display name
SHGFI_TYPENAME = 0x000000400 , // get type name
SHGFI_ATTRIBUTES = 0x000000800 , // get attributes
SHGFI_ICONLOCATION = 0x000001000 , // get icon location
SHGFI_EXETYPE = 0x000002000 , // return exe type
SHGFI_SYSICONINDEX = 0x000004000 , // get system icon index
SHGFI_LINKOVERLAY = 0x000008000 , // put a link overlay on icon SHGFI_SelectED = 0x000010000 , // show icon in selected state
SHGFI_ATTR_SPECIFIED = 0x000020000 , // get only specified attributes
SHGFI_LARGEICON = 0x000000000 , // get large icon
SHGFI_SMALLICON = 0x000000001 , // get small icon
SHGFI_OPENICON = 0x000000002 , // get open icon
SHGFI_SHELLICONSIZE = 0x000000004 , // get shell size icon
SHGFI_PIDL = 0x000000008 , // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES = 0x000000010 , // use passed dwFileAttribute
SHGFI_ADDOVERLAYS = 0x000000020 , // apply the appropriate overlays
SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay
} 3.FileAttributeFlags(这个.net中好像已经有了)
public enum FileAttributeFlags : int
...{
FILE_ATTRIBUTE_READONLY = 0x00000001 ,
FILE_ATTRIBUTE_HIDDEN = 0x00000002 ,
FILE_ATTRIBUTE_SYSTEM = 0x00000004 ,
FILE_ATTRIBUTE_DIRECTORY = 0x00000010 ,
FILE_ATTRIBUTE_ARCHIVE = 0x00000020 ,
FILE_ATTRIBUTE_DEVICE = 0x00000040 ,
FILE_ATTRIBUTE_NORMAL = 0x00000080 ,
FILE_ATTRIBUTE_TEMPORARY = 0x00000100 ,
FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200 ,
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 ,
FILE_ATTRIBUTE_COMPRESSED = 0x00000800 ,
FILE_ATTRIBUTE_OFFLINE = 0x00001000 ,
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000 ,
FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
}
然后 开始准备调用SHELL API了 :
程序代码[DllImport("shell32.dll " , EntryPoint ="SHGetFileInfo")]
public static extern int GetFileInfo( string pszPath, int dwFileAttributes,
ref FileInfoStruct psfi, int cbFileInfo, int uFlags);
好了现在一切都准备好了 我们现在通过下面的两个方法来获取图标
程序代码public static Icon GetLargeIcon(string pFilePath)
...{
FileInfoStruct _info = new FileInfoStruct();
Win32API.GetFileInfo(pFilePath, 0 , ref _info, Marshal.SizeOf(_info),
( int )(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_LARGEICON));
try
... catch
...{
return null ;
}
}
public static Icon GetSmallIcon(string pFilePath)
...{
FileInfoStruct _info = new FileInfoStruct();
Win32API.GetFileInfo(pFilePath, 0 , ref _info, Marshal.SizeOf(_info),
( int )(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_SMALLICON));
try
...
catch
...{
return null ;
}
}
呵呵 工作就做完了。但是我发现这样取出来的Icon在TreeView 中显示的时候特别难看。但是目前也没有什么好方法。毕竟图标太多了。
评论: 0 | 引用: 0 | 查看次数: 533
发表评论
你没有权限发表评论!
上一篇
下一篇

文章来自:
Tags: 






