[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
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 const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0;
public const uint SHGFI_SMALLICON = 0x1;
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(
string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);
///释放句柄
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DestroyIcon(IntPtr hIcon);
///Test 方法
private void button1_Click(object sender, EventArgs e) {
SHFILEINFO fileInfo = new SHFILEINFO();
ShellApi.SHGetFileInfo(@"D:/CETV/CETVProject/CetvTools/wait.gif", 0, ref fileInfo, (uint)Marshal.SizeOf(fileInfo), ShellApi.SHGFI_ICON | ShellApi.SHGFI_SMALLICON);
Icon ico = Icon.FromHandle(fileInfo.hIcon);
Bitmap bmp = new Bitmap(ico.Width, ico.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawIcon(ico, 0, 0);
this.pictureBox1.Image = bmp;
}