得到windows系统图标的解决方案

如果想得到windows中我的电脑或者网络邻居等系统图标可以有如下解决办法。

方案一
用图标提取软件从c:/winnt/system32/SHELL32.dll或者C:/WINNT/Explorer.exe中提取出来然后加入到自己的程序中(路径随操作系统和安装目录不同而变化)这种方法的缺点是不同的操作系统的系统图标有一些变化,比如说2003和2000的系统图标就有很大变化,如果你提取的是2000的图标,应用程序如果在2003下运行可能看起来有一些别扭。

方案二
同样是利用c:/winnt/system32/SHELL32文件来提取,但是这次是利用注册表和windows的函数来完成。代码如下:
HICON CTestDlg::GetShellIcon(int nIndex) 
{
HICON hIcon=NULL; 
HKEY hkeyShellIcons;

 

//打开注册表,读相应的图标项目
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE//Microsoft//Windows//CurrentVersion//Explorer//Shell I cons", 0,KEY_READ,&hkeyShellIcons)==ERROR_SUCCESS) 

char szBuffer[MAX_PATH]; 
DWORD dwSize=MAX_PATH; 

char szIndex[4]; 
sprintf(szIndex,"%d",nIndex); 
if(RegQueryValueEx(hkeyShellIcons,szIndex,NULL,NULL,(LPBYTE)szBuffer,&dwSize)==ERROR_SUCCESS) 
{
CString strFile,strIndex; 
AfxExtractSubString(strFile,szBuffer,0,','); 
AfxExtractSubString(strIndex,szBuffer,1,','); 
ExtractIconEx(strFile,atoi(strIndex),NULL,&hIcon,1); 

RegCloseKey(hkeyShellIcons); 
}
if(!hIcon) 
ExtractIconEx("SHELL32.DLL",nIndex,NULL,&hIcon,1); 

return hIcon; 
}
这种方法克服了第一种方法使用不灵活的缺点但是代码量比较大。(index目录在最后列出)

方案三
利用shell函数SHGetSpecialFolderLocation和SHGetFileInfo。代码如下:

LPITEMIDLIST lpItemIDList;
SHFILEINFO shinfo;
SHGetSpecialFolderLocation (this->m_hWnd, CSIDL_NETWORK, &lpItemIDList);
SHGetFileInfo( (LPCTSTR)lpItemIDList,
NULL,
&shinfo,
sizeof(shinfo),
SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME | SHGFI_ICON| SHGFI_SMALLICON|SHGFI_PIDL);
这是shinfo中的icon和hicon保存了得到的icon的值。
这种方法既有灵活性,代码量也比较少,推荐使用。在SHGetSpecialFolderLocation中的第二个参数是想得到的图片的CSIDL值。




【附表1:nindex值说明】 
nIndex 意义 说明
0 默认图标
1 默认的 .doc 图标*
2 可执行文件图标

3 关闭的文件夹图标
4 打开的文件夹图标
5 5.25' 驱动器图标
6 3.5' 驱动器图标
7 可移动的驱动器图标
8 硬盘驱动器图标
9 网络驱动器图标
10 断开的网络驱动器图标
11 CD-ROM驱动器图标
12 RAM驱动器图标
13 整个网络图标
14 网络连接图标 u
15 网络工作站图标 
16 本地打印机图标 *
17 网络图标 u
18 网络工作组图标 u
19 程序组图标 s
20 文档图标 s
21 设置图标 s
22 查找图标 s
23 帮助图标 s
24 运行图标 s
25 睡眠图标 s
26 Docking Station 图标 u
27 关机图标 s
28 共享图标 t
29 快捷方式的箭头图标 t
30 大箭头图标 u
31 空回收站图标 *
32 满的回收站图标 *
33 拨号网络图标 *
34 桌面图标
35 控制台图标 *
36 程序组图标 s
37 打印机文件夹图标 *
38 字体文件夹图标 *
39 Windows旗帜图标 * 软件开发网 
40 Audio CD 图标 
.
.
.
.49

后面标有符号的说明有特殊用法: 
* 这些图标可以在注册表的其他地方的设置。
t 这些图标必须是空白背景。 
s 这些图标将用在开始菜单上。 
u 这些图标可能并没有使用或不能通过注册表修改

原文地址:https://www.cnblogs.com/hzcya1995/p/13318739.html