在C#中获取各种文件的系统图标

原创 2007年09月14日 16:27:00
  在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 
            
...
                
return  Icon.FromHandle(_info.hIcon); 
            }
 
            
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 
            
...
                
return  Icon.FromHandle(_info.hIcon); 
            }
 
            
catch 
            
...
                
return   null ; 
            }
 
        }
呵呵 工作就做完了。但是我发现这样取出来的Icon在TreeView 中显示的时候特别难看。但是目前也没有什么好方法。毕竟图标太多了。

钩子编程(HOOK) 安装进程内鼠标钩子 (0)

[钩子编程(HOOK) 安装进程内鼠标钩子]钩子函数,Windows的钩子函数可以认为是Windows的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给Win...

C#模拟键盘鼠标事件 SendKeys 的特殊键代码表

使用 SendKeys 将键击和组合键击发送到活动应用程序。此类无法实例化。若要发送一个键击给某个类并立即继续程序流,请使用 Send。若要等待键击启动的任何进程,请使用 SendWait。 每个键都...

C#获取系统文件、文件夹和磁盘驱动器图标

最近开发一款软件需要用到获取系统文件的图标,在网上找了一下发现有以下方式获取: 1、调用API的方式获取 public class SystemIcon { /...

C#获取系统文件及文件夹图标

using System; using System.Runtime.InteropServices; using System.Windows.Forms; using System.IO; usi...

C# 系统应用之TreeView控件显示树状磁盘文件目录及加载图标

在C#系统应用毕设U盘防御软件中需要实现文件不可恢复的删除,首先需要实现类似于资源管理器的界面,通过TreeView控件显示"我的电脑"所有磁盘文件树状目录并加载相应图标.显示结果如下图所示: 一...

c#使用系统ImageList显示文件图标

今天在百度知道上看到一个提问,要做个简单的文件浏览器,于是拿出以前写的半成品修改了一下,中间碰到了一点小麻烦。主要是如何在c#里面给ListView控件设置图标时使用系统的ImageList,而不是自...
  • assuper
  • assuper
  • 2012年03月05日 13:45
  • 4049

C#Winform开发,Listview根据文件路径或扩展名显示系统文件图标

在Winform开发中,大家普遍利用Listview来显示文件列表。 但是Listview本身并不具备显示当前系统图标的功能。所以要想实现类似的功能,需要利用Icon和Imagelist来辅助。 1...

C# 获取指定文件的图标

  • 2009年04月23日 13:51
  • 8KB
  • 下载

C#类似windows资源管理器-获取文件图标

在做文件管理器的过程中,有一个非常

c#获取文件大图标

  • 2017年03月14日 14:28
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C#中获取各种文件的系统图标
举报原因:
原因补充:

(最多只允许输入30个字)