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

  在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 中显示的时候特别难看。但是目前也没有什么好方法。毕竟图标太多了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值