程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#中通過API調用獲取文件圖標

C#中通過API調用獲取文件圖標

編輯:關於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 [Page]
    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 , [Page]
    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);
      } [Page]
      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 中顯示的時候特別難看。但是目前也沒有什麼好方法。畢竟圖標太多了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved