zoukankan      html  css  js  c++  java
  • 得到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 这些图标可能并没有使用或不能通过注册表修改



     

  • 相关阅读:
    普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用
    z
    EF架构~XMLRepository仓储的实现~续(XAttribute方式)
    缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
    爱上MVC系列~带扩展名的路由失效问题
    开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
    缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续
    一分钟对我们的重要意义
    VS2010添加默认路径,库以及Lib
    Android中振动器(Vibrator)的使用
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/1499029.html
Copyright © 2011-2022 走看看