110,571
社区成员
发帖
与我相关
我的任务
分享
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
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;
}
class Win32
{
/// <summary>
/// 以下为获取图标Api
/// </summary>
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
public const uint SHGFI_USEFILEATTRIBUTES = 0x10;
[DllImport("shell32.dll",EntryPoint="SHGetFileInfo",SetLastError=true,CharSet=CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref FileInfoStruct psfi, uint cbSizeFileInfo, uint uFlags);
[DllImport("shell32.dll",EntryPoint="ExtractIconEx")]
public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);
[DllImport("user32.dll",EntryPoint="DestoryIcon")]
public static extern int DestoryIcon(IntPtr hIcon);
}
public static class GetSystemIcon
{
///
/// 依据文件名读取图标,若指定文件不存在,则返回空值。
///
///
///
public static Icon GetIconByFileName(string fileName,bool isLargeIcon)
{
if (fileName == null || fileName.Equals(string.Empty)) return null;
if (!File.Exists(fileName)) return null;
FileInfoStruct psfi = new FileInfoStruct();
if (isLargeIcon) //获取大图标
{
Win32.SHGetFileInfo(fileName, 0, ref psfi, (uint)Marshal.SizeOf(psfi), Win32.SHGFI_ICON | Win32.SHGFI_USEFILEATTRIBUTES | Win32.SHGFI_LARGEICON);
}
else //获取小图标
{
Win32.SHGetFileInfo(fileName, 0, ref psfi, (uint)Marshal.SizeOf(psfi), Win32.SHGFI_ICON | Win32.SHGFI_USEFILEATTRIBUTES | Win32.SHGFI_SMALLICON);
}
Icon icon = Icon.FromHandle(psfi.hIcon).Clone() as Icon;
Win32.DestoryIcon(psfi.hIcon);
return icon;
}
}
class Program
{
const int SHGFI_TYPENAME = 0x000000400;
const int SHGFI_DISPLAYNAME = 0x000000200;
const int sizeOfFileInfo = 352;//FileInfoStruct结构大小
[DllImport("shell32.dll", EntryPoint = "SHGetFileInfo", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(string name, int attr, IntPtr pInfo, int infoSize, int flags);
static void Main(string[] args)
{
string name = @"F:\Title.bmp";
IntPtr pInfo = Marshal.AllocHGlobal(sizeOfFileInfo);//申请平台内存
SHGetFileInfo(name, -1, pInfo, sizeOfFileInfo, SHGFI_DISPLAYNAME);
byte[] buffers = new byte[260];//读取指定位置指定字节,就是结构中的szDisplayName字段
for (int i = 12; i < buffers.Length; i++)
{
buffers[i-12] = Marshal.ReadByte(pInfo, i);
}
int m = 0;//因为读来的是Unicode双字节字符,做下判断
for (int i = 0; i < buffers.Length; i++)
{
if (buffers[i] == 0)
m++;
else
m--;
if(m==2)
break;
Console.Write((char)buffers[i]);
}
Console.WriteLine();
Marshal.FreeHGlobal(pInfo);
}
}
}