我用下面的代碼,不知道這是否透明背景的支持,但你可以試試看:
private const uint SHGFI_ICON = 0x100;
private const uint SHGFI_LARGEICON = 0x0;
private const uint SHGFI_SMALLICON = 0x1;
private const uint SHGFI_DISPLAYNAME = 0x00000200;
private const uint SHGFI_TYPENAME = 0x400;
public static Icon GetSmallFileIcon(this FileInfo file)
{
if (file.Exists)
{
SHFILEINFO shFileInfo = new SHFILEINFO();
SHGetFileInfo(file.FullName, 0, ref shFileInfo, (uint)Marshal.SizeOf(shFileInfo), SHGFI_ICON | SHGFI_SMALLICON);
return Icon.FromHandle(shFileInfo.hIcon);
}
else return SystemIcons.WinLogo;
}
public static Icon GetSmallFileIcon(string fileName)
{
return GetSmallFileIcon(new FileInfo(fileName));
}
public static Icon GetLargeFileIcon(this FileInfo file)
{
if (file.Exists)
{
SHFILEINFO shFileInfo = new SHFILEINFO();
SHGetFileInfo(file.FullName, 0, ref shFileInfo, (uint)Marshal.SizeOf(shFileInfo), SHGFI_ICON | SHGFI_LARGEICON);
return Icon.FromHandle(shFileInfo.hIcon);
}
else return SystemIcons.WinLogo;
}
public static Icon GetLargeFileIcon(string fileName)
{
return GetLargeFileIcon(new FileInfo(fileName));
}
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public SHFILEINFO(bool b)
{
hIcon = IntPtr.Zero; iIcon = IntPtr.Zero; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
}
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;
};
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
感謝您的摘錄。其實我知道SHGetFileInfo函數。我只是想避免檢查縮略圖是否可用,如果不是提取圖標。 – Giorgi 2010-12-22 16:02:36