C#中呼叫API獲得指定檔案的圖示
最近在寫一個媒體管理的伺服器程式。裡面要用到了一個獲得指定檔案的整合圖示的。所以就寫了一個用C#中呼叫API來獲得指定檔案的圖示的程式碼,程式碼如下:
匯入API的類:
using System;
using System.Runtime.InteropServices;
namespace MediaClient
...{
public class Win32
...{
[DllImport("shell32.dll", EntryPoint = "ExtractIcon")]
public static extern int ExtractIcon(IntPtr hInst,string lpFileName,int nIndex);
[DllImport("shell32.dll", EntryPoint = "SHGetFileInfo")]
public static extern IntPtr SHGetFileInfo(string pszPath,uint dwFileAttribute,ref SHFILEINFO psfi,uint cbSizeFileInfo,uint Flags);
[DllImport("User32.dll", EntryPoint = "DestroyIcon")]
public static extern int DestroyIcon(IntPtr hIcon);
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
...{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
}
}
呼叫方法:
/**////
/// 獲得指定路徑下面的所有檔案及資料夾
///
/// 路徑
///
public ArrayList GetListViewItem(string path,ImageList imglist)
...{
Win32.SHFILEINFO shfi = new Win32.SHFILEINFO();
try
...{
string[] dirs = Directory.GetDirectories(path);
string[] files = Directory.GetFiles(path);
ArrayList itemarr = new ArrayList();
for (int i = 0; i < dirs.Length; i++)
...{
string[] info = new string[4];
DirectoryInfo dir = new DirectoryInfo(dirs[i]);
//獲得圖示
Win32.SHGetFileInfo(dirs[i],
(uint)0x80,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
(uint)(0x100 | 0x400)); //取得Icon和TypeName
//新增圖示
imglist.Images.Add(dir.Name, (Icon)Icon.FromHandle(shfi.hIcon).Clone());
info[0] = dir.Name;
info[1] = "";
info[2] = "資料夾";
info[3] = dir.LastWriteTime.ToString();
ListViewItem item = new ListViewItem(info,dir.Name);
itemarr.Add(item);
//銷燬圖示
Win32.DestroyIcon(shfi.hIcon);
}
for (int i = 0; i < files.Length; i++)
...{
string[] info = new string[4];
FileInfo fi = new FileInfo(files[i]);
//獲得圖示
Win32.SHGetFileInfo(files[i],
(uint)0x80,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
(uint)(0x100 | 0x400)); //取得Icon和TypeName
//新增圖示
imglist.Images.Add(fi.Name,(Icon)Icon.FromHandle(shfi.hIcon).Clone());
info[0] = fi.Name;
info[1] = fi.Length.ToString();
info[2] = fi.Extension.ToString();
info[3] = fi.LastWriteTime.ToString();
ListViewItem item = new ListViewItem(info,fi.Name);
itemarr.Add(item);
//銷燬圖示
Win32.DestroyIcon(shfi.hIcon);
}
return itemarr;
}
catch
...{
return null;
}
}
uFlags常數:
SHGFI_ICON = 0x100
SHGFI_DISPLAYNAME = 0x200,
SHGFI_TYPENAME = 0x400,
SHGFI_ATTRIBUTES = 0x800,
SHGFI_ICONLOCATION = 0x1000,
SHGFI_EXETYPE = 0x2000,
SHGFI_SYSICONINDEX = 0x4000,
SHGFI_LINKOVERLAY = 0x8000,
SHGFI_SELECTED = 0x10000,
SHGFI_ATTR_SPECIFIED = 0x20000,
SHGFI_LARGEICON = 0x0,
SHGFI_SMALLICON = 0x1,
SHGFI_OPENICON = 0x2,
SHGFI_SHELLICONSIZE = 0x4,
SHGFI_PIDL = 0x8,
SHGFI_USEFILEATTRIBUTES = 0x10
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14766526/viewspace-562964/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C#中通過API呼叫獲取檔案圖示C#API
- VB程式設計獲取檔案中整合的圖示程式設計
- bootstrap中如何使input中的小圖示獲得點選事件boot事件
- whatsns模板檔案中如何呼叫指定類目下的內容
- C#中獲取Excel檔案中的表名C#Excel
- aspectJ中怎樣獲得呼叫 pointcut 的物件物件
- lazada獲得lazada商品詳情 API呼叫說明 請示程式碼展示API
- c# 呼叫.bat檔案C#BAT
- java中獲得檔案大小,用RandomAccessFile的lengh方法JavarandomMac
- C#中呼叫Windows API的要點 (轉)C#WindowsAPI
- 獲得檔案的大小(c語言)C語言
- asp.net網頁中呼叫c#寫的dll檔案ASP.NET網頁C#
- WinPE中如何改變檔案顯示圖示
- 【macOS】顯示/隱藏 指定檔案Mac
- C# Winform中如何獲取檔名與檔案路徑C#ORM
- c#檔案路徑的獲取C#
- C#常見的檔案路徑ApiC#API
- 淘寶API分享:獲得店鋪的所有商品 APIAPI
- 解壓tar包中的指定檔案
- mybatis中 mapper.xml檔案中,獲取陣列中指定的位置的資料MyBatisAPPXML陣列
- JAVA中如何獲得JPG或GIF圖片的正常顯示高度和寬度呢?Java
- 呼叫百度地圖api只顯示網格地圖API
- C#獲得彈出框的值C#
- c# 呼叫微吼直播APIC#API
- 京東獲得店鋪的所有商品 APIAPI
- 如何獲得Session物件及在Hibernate.cfg.xml檔案中的配置Session物件XML
- C#實現把指定資料夾下的所有檔案複製到指定路徑下以及修改指定檔案的字尾名C#
- 刪除檔案中包含指定字串的行字串
- 遍歷檔案Java中遍歷出指定目錄中的所有檔案Java
- 阿里巴巴中國站獲得公司檔案資訊 API 返回值說明阿里API
- PHP獲取指定函式定義在哪個檔案中及行號PHP函式
- java中呼叫dll檔案的步驟Java
- py目錄下獲取指定字尾檔案打包成zip檔案
- Java反射機制demo(五)—獲得並呼叫一個類中的方法Java反射
- C#呼叫Windows API詳解(上)C#WindowsAPI
- 【高德地圖API】如何獲得行政區域?如何製作行政規劃圖?地圖API
- 阿里巴巴中國站獲得工廠檔案資訊 API 返回值說明阿里API
- 阿里巴巴中國站獲得實力檔案資訊 API 返回值說明阿里API