#region
|
|
using System;
|
using System.Drawing;
|
using System.Drawing.Imaging;
|
using System.IO;
|
using System.Runtime.InteropServices;
|
using Microsoft.Win32;
|
|
#endregion
|
|
namespace CSFrameworkV5.Common
|
{
|
/// <summary>
|
/// 图标工具
|
/// </summary>
|
public class IconTool
|
{
|
/// <summary>
|
/// 数组转换为图像
|
/// </summary>
|
/// <param name="bs"></param>
|
/// <returns></returns>
|
public static Image ByteToImage(byte[] bs)
|
{
|
var ms = new MemoryStream(bs);
|
var bmp = new Bitmap(ms);
|
ms.Close();
|
return bmp;
|
}
|
|
/// <summary>
|
/// 获取文件的ICO图标
|
/// </summary>
|
/// <param name="fileType">文件类型(*.exe,*.dll)</param>
|
/// <param name="large">大图标</param>
|
/// <param name="small">返回小图标</param>
|
public static void CreateFileIcon(string fileType, out Icon large,
|
out Icon small)
|
{
|
string des;
|
|
if (fileType.Trim() == "") //预设图标
|
{
|
GetDefaultIcon(out large, out small);
|
}
|
else if (fileType.ToUpper() == ".EXE") //应用程序图标单独获取
|
{
|
var l = IntPtr.Zero;
|
var s = IntPtr.Zero;
|
|
ExtractIconExW(
|
Path.Combine(Environment.SystemDirectory, "shell32.dll"), 2,
|
ref l, ref s, 1);
|
|
large = Icon.FromHandle(l);
|
small = Icon.FromHandle(s);
|
}
|
else //其它类型的图标
|
{
|
GetExtsIconAndDescription(fileType, out large, out small,
|
out des);
|
}
|
|
if (large == null || small == null) //无法获取图标,预设图标
|
GetDefaultIcon(out large, out small);
|
}
|
|
/// Return Type: UINT->unsigned int
|
/// lpszFile: LPCWSTR->WCHAR*
|
/// nIconIndex: int
|
/// phiconLarge: HICON*
|
/// phiconSmall: HICON*
|
/// nIcons: UINT->unsigned int
|
[DllImportAttribute("shell32.dll", EntryPoint = "ExtractIconExW",
|
CallingConvention = CallingConvention.StdCall)]
|
public static extern uint ExtractIconExW(
|
[InAttribute] [MarshalAsAttribute(UnmanagedType.LPWStr)]
|
string lpszFile, int nIconIndex,
|
ref IntPtr phiconLarge, ref IntPtr phiconSmall, uint nIcons);
|
|
/// <summary>
|
/// 获取缺省图标
|
/// </summary>
|
/// <param name="largeIcon"></param>
|
/// <param name="smallIcon"></param>
|
public static void GetDefaultIcon(out Icon largeIcon,
|
out Icon smallIcon)
|
{
|
largeIcon = smallIcon = null;
|
var phiconLarge = new IntPtr();
|
var phiconSmall = new IntPtr();
|
ExtractIconExW(
|
Path.Combine(Environment.SystemDirectory, "shell32.dll"), 0,
|
ref phiconLarge,
|
ref phiconSmall, 1);
|
if (phiconLarge.ToInt32() > 0)
|
largeIcon = Icon.FromHandle(phiconLarge);
|
|
if (phiconSmall.ToInt32() > 0)
|
smallIcon = Icon.FromHandle(phiconSmall);
|
}
|
|
/// <summary>
|
/// 通过扩展名得到图标和描述
|
/// </summary>
|
/// <param name="ext">扩展名</param>
|
/// <param name="LargeIcon">得到大图标</param>
|
/// <param name="smallIcon">得到小图标</param>
|
public static void GetExtsIconAndDescription(string ext,
|
out Icon largeIcon, out Icon smallIcon,
|
out string description)
|
{
|
//默认值
|
largeIcon = null;
|
smallIcon = null;
|
description = "";
|
|
if (string.IsNullOrWhiteSpace(ext)) return;
|
|
if (ext.Length > 4) return; //控制文件扩展名长度4位,//防止注册表操纵 .jpg/.pdf
|
|
var extsubkey =
|
Registry.ClassesRoot.OpenSubKey(ext); //从注册表中读取扩展名相应的子键
|
|
if (extsubkey != null)
|
{
|
var extdefaultvalue =
|
extsubkey.GetValue(null).ToStringEx(); //取出扩展名对应的文件类型名称
|
var typesubkey =
|
Registry.ClassesRoot
|
.OpenSubKey(extdefaultvalue); //从注册表中读取文件类型名称的相应子键
|
if (typesubkey != null)
|
{
|
description =
|
typesubkey.GetValue(null).ToStringEx(); //得到类型描述字符串
|
var defaulticonsubkey =
|
typesubkey.OpenSubKey("DefaultIcon"); //取默认图标子键
|
if (defaulticonsubkey != null)
|
{
|
//得到图标来源字符串
|
var defaulticon = defaulticonsubkey.GetValue(null)
|
.ToStringEx(); //取出默认图标来源字符串
|
var iconstringArray = defaulticon.Split(',');
|
var nIconIndex = 0;
|
if (iconstringArray.Length > 1)
|
int.TryParse(iconstringArray[1], out nIconIndex);
|
|
//得到图标
|
var phiconLarge = new IntPtr();
|
var phiconSmall = new IntPtr();
|
ExtractIconExW(iconstringArray[0].Trim('"'), nIconIndex,
|
ref phiconLarge, ref phiconSmall, 1);
|
if (phiconLarge.ToInt32() > 0)
|
largeIcon = Icon.FromHandle(phiconLarge);
|
|
if (phiconSmall.ToInt32() > 0)
|
smallIcon = Icon.FromHandle(phiconSmall);
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 图像转换为数组
|
/// </summary>
|
/// <param name="image"></param>
|
/// <returns></returns>
|
public static byte[] ImageToByte(Image image)
|
{
|
var ms = new MemoryStream();
|
image.Save(ms, ImageFormat.Bmp);
|
var bs = ms.ToArray();
|
ms.Close();
|
return bs;
|
}
|
}
|
|
/// <summary>
|
/// 图标句柄
|
/// </summary>
|
[StructLayoutAttribute(LayoutKind.Sequential)]
|
public struct HICON__
|
{
|
public int unused;
|
}
|
}
|