ITPub博客

首页 > Linux操作系统 > Linux操作系统 > C#中通过API调用获取文件图标

C#中通过API调用获取文件图标

原创 Linux操作系统 作者:freshairpeng 时间:2009-03-05 22:53:04 0 删除 编辑
在C#中要获取各种文件的图标,可以通过API调用来完成。主要的函数是SHGetFileInfo.在C#中操作的方式如下 :
 
  第一步:准备SHGetFileInfo需要的各种参数

  1.FileInfoStruct

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->[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

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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了 : 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->[DllImport("shell32.dll " , EntryPoint ="SHGetFileInfo")]
public static extern int GetFileInfo( string  pszPath,  int  dwFileAttributes,
ref  FileInfoStruct psfi,  int  cbFileInfo, int  uFlags);

  好了现在一切都准备好了 我们现在通过下面的两个方法来获取图标

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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 ;
}
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14766526/viewspace-562963/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-25

  • 博文量
    69
  • 访问量
    246269