C# 获取exe、dll中的图标,支持获取256x256分辨率
在网上找过许多文章,都没有成功获取过大图标,只能获取最大32x32。最后自己尝试了相关的windows api,终于找到一个可用的。
主要用到的C++的PrivateExtractIcons函数,具体说明请看:PrivateExtractIcons function
该函数原文有个说明可能需要注意一下:[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]
UINT WINAPI PrivateExtractIcons(
_In_ LPCTSTR lpszFile,
_In_ int nIconIndex,
_In_ int cxIcon,
_In_ int cyIcon,
_Out_opt_ HICON *phicon,
_Out_opt_ UINT *piconid,
_In_ UINT nIcons,
_In_ UINT flags
);
C#使用DLL import进行引用。
[DllImport("User32.dll")]
public static extern int PrivateExtractIcons(
string lpszFile, //文件名可以是exe,dll,ico,cur,ani,bmp
int nIconIndex, //从第几个图标开始获取
int cxIcon, //获取图标的尺寸x
int cyIcon, //获取图标的尺寸y
IntPtr[] phicon, //获取到的图标指针数组
int[] piconid, //图标对应的资源编号
int nIcons, //指定获取的图标数量,仅当文件类型为.exe 和 .dll时候可用
int flags //标志,默认0就可以,具体可以看LoadImage函数
);
说明:如果想要获取的图标尺寸为256x256,而实际资源文件中的图标尺寸小于256x256的话,则会获取存在的最高分标率,色彩数最丰富的的图标,并拉伸。
具体代码如下
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace TryGetExeLargeIcon
{
class Program
{
[STAThread]
static void Main(string[] args)
{
//选择文件对话框
var opfd = new System.Windows.Forms.OpenFileDialog { Filter = "资源文件|*.exe;*.dll" };
if (opfd.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
var file = opfd.FileName; //指定存放图标的文件夹
const string folderToSave = "D:\\temp\\";
if (!Directory.Exists(folderToSave)) Directory.CreateDirectory(folderToSave); //选中文件中的图标总数
var iconTotalCount = PrivateExtractIcons(file, , , , null, null, , ); //用于接收获取到的图标指针
IntPtr[] hIcons = new IntPtr[iconTotalCount];
//对应的图标id
int[] ids = new int[iconTotalCount];
//成功获取到的图标个数
var successCount = PrivateExtractIcons(file, , , , hIcons, ids, iconTotalCount, ); //遍历并保存图标
for (var i = ; i < successCount; i++)
{
//指针为空,跳过
if (hIcons[i] == IntPtr.Zero) continue; using (var ico = Icon.FromHandle(hIcons[i]))
{
using (var myIcon = ico.ToBitmap())
{
myIcon.Save(folderToSave + ids[i].ToString("") + ".png", ImageFormat.Png);
}
}
//内存回收
DestroyIcon(hIcons[i]);
}
} //details: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648075(v=vs.85).aspx
//Creates an array of handles to icons that are extracted from a specified file.
//This function extracts from executable (.exe), DLL (.dll), icon (.ico), cursor (.cur), animated cursor (.ani), and bitmap (.bmp) files.
//Extractions from Windows 3.x 16-bit executables (.exe or .dll) are also supported.
[DllImport("User32.dll")]
public static extern int PrivateExtractIcons(
string lpszFile, //file name
int nIconIndex, //The zero-based index of the first icon to extract.
int cxIcon, //The horizontal icon size wanted.
int cyIcon, //The vertical icon size wanted.
IntPtr[] phicon, //(out) A pointer to the returned array of icon handles.
int[] piconid, //(out) A pointer to a returned resource identifier.
int nIcons, //The number of icons to extract from the file. Only valid when *.exe and *.dll
int flags //Specifies flags that control this function.
); //details:https://msdn.microsoft.com/en-us/library/windows/desktop/ms648063(v=vs.85).aspx
//Destroys an icon and frees any memory the icon occupied.
[DllImport("User32.dll")]
public static extern bool DestroyIcon(
IntPtr hIcon //A handle to the icon to be destroyed. The icon must not be in use.
);
}
}
C# 获取exe、dll中的图标,支持获取256x256分辨率的更多相关文章
- C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客
原文:C#获取C# DLL中的指定接口的所有实现实例 - qq_19759475的博客 - CSDN博客 public static List<T> CreateTarInterface& ...
- javascript获取iframe框架中页面document对象,获取子页面里面的内容,iframe获取父页面的元素,
javascript获取iframe框架中,加载的页面document对象 因为浏览器安全限制,对跨域访问的页面,其document对象无法读取.设置属性 function getDocument(i ...
- bat 获取 exe 文件中 产品版本号并存储到变量中
set EXE='D:\gitlab\drivereasy3\DriverEasyWPF\bin\Release\DriverEasy.exe' powershell "(Get-Item ...
- 获取当前div中的文本(只获取当前div的, 子元素不要, 基于layui)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- .Net中把图片等文件放入DLL中,并在程序中引用
原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...
- vim 正则表达式获取双引号中的字符
vim 正则表达式获取双引号中的字符 1.获取双引号中的字符 :%s/.*\".∗\".*/\1/ 2.用字符串建立标签 如 hello <hello></ ...
- AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)
使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
- PyQt(Python+Qt)学习随笔:model/view架构中支持QListView列表中展示图标的两种方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListView列表视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖 ...
随机推荐
- python socket.error: [Errno 10054] 解决方法
我用的是python2.7 我搜网上10054错误解决方法的时候发现,大部分文章都是以python3为基础的,对于python2不适用. python socket.error: [Errno 1 ...
- swipe和swiper的区别
swipe.js--移动WEB页面内容触摸滑动类库 参考http://www.jiawin.com/swipe-mobile-touch-slider 1.swipe只提供简单轮播切换,底部的圆点颜色 ...
- 庖丁解牛——CY7C68013A开发框架
大家好,好久不见了,距离上次发文章都有两个多星期了,非常高兴同时也非常感谢你们能一直关注我.之前在公众号上收到网友的消息,其大概意思就是问我能不能出点USB干货,为此我就把第二篇--解密USB2.0数 ...
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
(1)下边的一个Java类包含了所有Map.Set.List.数组.属性集合等这些容器,主要用于演示spring的注入配置: package com.lc.collection; import jav ...
- YAML - 简介
YAML - YAML An't a Markup Lanague P.S. YAML was originally was side to mean Yet Another Markup Langu ...
- Spring思维导图(一)
关于Spring Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架 ...
- 6,EasyNetQ-基于Topic的路由
RabbitMQ具有非常酷的功能,基于主题的路由,允许订阅者基于多个标准过滤消息. 主题是与邮件一起发布的点分隔的单词列表. 例子是"stock.usd.nyse"或"b ...
- 【NO.13】Jmeter - 在Linux整理和计算测试结果
我们现在描述的是:在Linux系统使用Jmeter执行性能测试. 所以当执行完测试以后,就要计算一下测试结果,反馈给开发人员嘛. 在Linux系统使用Jmeter执行性能测试都包含哪些步骤,来,回顾一 ...
- 接口的作用(C#)
C#中的接口(Interface)对于很多初学者来说是个很容易迷糊的东西,使用起来很简单,无非就是定义接口,接口里面包含一些属性.索引器.事件和一些没有修饰符的方法,也没有方法的具体实现代码:然后在类 ...
- Ignite Web 控制台(使用官方免费部署的控制台)
前提: 假设已安装ignite,并且安装路径为:/usr/apache-ignite-fabric-2.1.0-bin 1.下载Web Agent 打开链接:https://console.gridg ...