在Vista或更高版本Windows系统中, 获取超大图标的办法
这几天写个小东西, 需要获取系统正在运行的程序图标, 一般来说32*32就足够了, 不过既然Win7能够支持超大图标(256*256), 咱们也需要与时俱进, 说不定什么时候遇到个变态客户就有这要求了
找了下以前的资料, 获取程序图标基本都是用SHGetFileInfo来获取, 这样只能得到最大32*32的
想获取超大的需要用SHGetImageList这个API, 不过很奇怪Delphi里面虽然有这个API, 可是调用出错, 只能从DLL里面重新加载了
网上相关资料很少, 但是还是能找到的, 不过不知道为什么, 找到的都是一样的代码, 相对下面的代码网上的资料都是这样获取图标句柄的
Result := ImageList_GetIcon(nImageList, Pred(ImageList_GetImageCount(nImageList)), ILD_NORMAL);
虽然执行结果一样, 但是很让人费解, 另外, 这样做如果在程序内多次获取多个程序的图标就会出现得到的都是一样的图标的问题(是一个BUG)
解决方法: SHGetFileInfo函数本来就是获取图标索引的, 直接使用得到的结果就行了
Result := ImageList_GetIcon(nImageList, nFileInfo.iIcon, ILD_NORMAL);
完整函数如下
uses
ShellAPI, CommCtrl; const
SHIL_LARGE = ; {32x32}
SHIL_SMALL = ; {16x16}
SHIL_EXTRALARGE = ; {48x48}
SHIL_SYSSMALL = ; {16x16}
SHIL_JUMBO = ; {256x256} function GetFileIconEX(AFile: string; ASHIL_FLAG: Cardinal): HICON; function _X: Boolean; {判断是否符合系统版本}
begin
Result := False;
if Win32MajorVersion < then
Exit;
if (Win32MajorVersion = ) and (Win32MinorVersion < ) then
Exit;
Result := True;
end; type
_SHGetImageList = function (iImageList: Integer; const riid: TGUID;
var ppvObj: Pointer): HResult; stdcall;
var
nHandle: THandle;
nImageList: HIMAGELIST;
nSHGetImageList: _SHGetImageList;
nFileInfo: TSHFileInfo;
const
IID_IImageList: TGUID = '{46EB5926-582E-4017-9FDF-E8998DAA0950}';
begin
Result := ;
nHandle:= LoadLibrary('Shell32.dll');
nImageList := ;
if nHandle <> S_OK then
try
nSHGetImageList := GetProcAddress(nHandle, PChar());
if Assigned(nSHGetImageList) and _X then
nSHGetImageList(ASHIL_FLAG, IID_IImageList, Pointer(nImageList));
finally
FreeLibrary(nHandle);
end;
if nImageList > then
begin
SHGetFileInfo(PChar(AFile), FILE_ATTRIBUTE_NORMAL, nFileInfo, SizeOf(TSHFileInfo),
SHGFI_SYSICONINDEX);
Result := ImageList_GetIcon(nImageList, nFileInfo.iIcon, ILD_NORMAL);
end;
end;
在Vista或更高版本Windows系统中, 获取超大图标的办法的更多相关文章
- 解决Macbook Pro 2017安装Windows10双系统后在Windows系统中Apple蓝牙鼠标不能使用问题
MAC BOOK PRO 2017安装Windows10双系统 在Windows系统中蓝牙鼠标不能使用解决办法 最近因工作需要,macOS系统不能要求,大部分工作必须要在Windows系统中进行,最初 ...
- 如何在Windows Server 2012及更高版本中将域控制器降级
如何在Windows Server 2012及更高版本中将域控制器降级 如果不降级就重装系统,会出问题,所以在将域控系统重装系统之前一定要先降级. 使用服务器管理器将 Windows Server 2 ...
- 关于IIS部署时出现“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”的问题解决摘要
系统环境:windows2008 X64 IIS版本:iis7 oracle客户端版本:11g,另外装了32位的客户端. 网站.net framework版本: 4.0 目前状况,IIS可以正常运行, ...
- 【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
出于项目需要,我们的Qt程序需要运行在 1. Windows/Linux-X86平台(CPU为常见的桌面级CPU如G3220.I3等): 2. Windows/Linux-X86低功耗平台(CPU为I ...
- “System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本” 的解决方案
在项目部署过程中ORACLE客户端多次会遇"System.Exception: System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本&qu ...
- 转发:maven打包时始终出现以下提示:-source 1.3 中不支持泛型(请使用 -source 5 或更高版本以启用泛型)
maven打包时始终出现以下提示: 1.-source 1.3 中不支持泛型(请使用 -source 5 或更高版本以启用泛型)List<User> userList= new Array ...
- EBS报错FRM-92095:Oracle JInitiator版本太旧,请安装版本1.1.8.2或更高版本
EBS打开报错FRM-92095:Oracle JInitiator版本太旧,请安装版本1.1.8.2或更高版本 打开EBS的form,系统报错,中文提示信息是:FRM-92095:oracle ji ...
- 2019年9月(System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。)问题解决记录
System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本. 在百度上寻找了很久,都说是权限的问题,可是更改过后一点效果也没有. 实际上真 ...
- Win10安装.Net Framework4.7及更高版本
问题描述 使用VS打开项目工程时,提示未安装.net framework4.7,但在启用或关闭windows功能里已经勾选了.net framework 4.7的全部功能. 直接从网上下载.net f ...
随机推荐
- ViewPager左右滑动
布局: <android.support.v4.view.ViewPager android:id="@+id/viewpager_main" android:layout_ ...
- nignx重启启动关闭
http://www.cnblogs.com/jianxie/p/3990377.html 一.启动 cd usr/local/nginx/sbin ./nginx cd usr/local/ngin ...
- CodeForces 300C --数论
A - A Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- transient的理解
用法解释 1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2)transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被 ...
- mysql死锁问题
形成死锁的条件 我们mysql用的存储引擎是innodb,从日志来看,innodb主动探知到死锁,并回滚了某一苦苦等待的事务. 问题来了,innodb是怎么探知死锁的? 直观方法是在两个事务相互等待时 ...
- CSGrandeur的WebGL学习——WebGL教程
在线查看:http://csgrandeur.gitbooks.io/webgl-learn/content/ 离线mobi:http://files.cnblogs.com/files/CSGran ...
- MONO 架构
- 【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)
http://wikioi.com/problem/1904/ 这题没看数据的话是一个大坑(我已报告官方修复了),答案只要求数量,不用打印路径...orz 最小路径覆盖=n-最大匹配,这个我在说二分图 ...
- stringstream 使用方法
C++中的stringstream是专门用来处理字符串流的,可以按顺序将string或int都拼接起来,而不用把int转换为string格式,使用方法如下: #include <string&g ...
- spark-shell --conf
spark-shell --conf -h Usage: ./bin/spark-shell [options] Options: --master MASTER_URL spark://host:p ...