【问题标题】:Where can I find the default icons used for folders and applications?在哪里可以找到用于文件夹和应用程序的默认图标?
【发布时间】:2009-01-20 11:48:39
【问题描述】:

我正在尝试加载资源管理器显示的默认 HICON:

  • 打开的文件夹
  • 一个没有自己嵌入默认图标的 exe。这也可以在 Vista 上调用的“添加/删除程序”或“程序和功能”中看到。

你知道在哪里可以找到这些吗?我认为文件夹图标可能在 explorer.exe 的资源中。但不知道可以从哪里检索默认应用程序图标。

此外,您是否有任何示例代码可以将它们加载到 HICON 中。

我真的需要它在多个 Windows 操作系统上工作:2000、XP、Vista、2008


感谢到目前为止的帮助。我在 Vista 上并查看了 Shell32.dll。我没有在其中看到与资源管理器中的应用程序显示的默认图标相同的图标。我可能会错过它 - 有 278 个图标可供查看 - 它肯定在其中,还是我应该查看其他位置?

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    使用SHGetFileInfo API。

    SHFILEINFO sfi;
    SecureZeroMemory(&sfi, sizeof sfi);
    
    SHGetFileInfo(
        _T("Doesn't matter"),
        FILE_ATTRIBUTE_DIRECTORY,
        &sfi, sizeof sfi,
        SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
    

    将为您提供文件夹图标的图标句柄。

    要获取“打开”图标(即文件夹显示为打开的图标),还要将最后一个参数中的 SHGFI_OPENICON 传递给 SHGetFileInfo()。

    [编辑]

    忽略所有告诉您在注册表中四处寻找的答案!因为这不能可靠地工作,如果它们是定制/皮肤的,将显示错误的图标,并且可能在未来的 Windows 版本中不起作用。 此外,如果您从系统 dll/exe 中提取图标,您可能会遇到法律问题,因为它们受版权保护。

    【讨论】:

      【解决方案2】:

      Vista 添加SHGetStockIconInfo 等等 NT6+ 是最好的方法。

      Archive 显示可用图标的 MSDN 文档

      在旧平台上,SHGetFileInfo 就像 Stefan 所说的那样。

      如果你想使用未记录的东西,系统映像列表中的前 5 个左右的图标包括默认文件夹和应用程序图标(系统映像列表在 NT 上不共享,但由于某种原因,所有副本都排在第一位5 个左右的图标,无需使用 SHGetFileInfo)

      这些默认图标默认来自shell32.dll,但可以在注册表中更改:

      HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell 图标

      【讨论】:

        【解决方案3】:

        我认为它们在 %windir%\system32\SHELL32.dll 中

        在网上找到了一些代码,试试看是否可行:

        HINSTANCE hDll;
        hDll = LoadLibrary ( "SHELL32.dll" );
        wincl.hIcon   = LoadIcon (hDll , MAKEINTRESOURCE ( 1 ));
        wincl.hIconSm = LoadIcon (hDll, MAKEINTRESOURCE ( 2 ));
        

        编辑:Windows 在“moricons.dll”中有更多图标,但我认为文件和文件夹图标应该都在 shell32.dll 中。提醒一下,Vista 中的图标具有不同的分辨率,最高为 256x256,因此您正在查看的分辨率为 32x32 的图标可能与相同图标的全分辨率版本看起来不同。

        【讨论】:

        • shell32 中的图标是默认的,但可以在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons 中更改所有这些无论如何都没有记录,不应使用。使用 SHGetFileInfo() 和/或 SHGetStockIconInfo()
        • 我知道此评论不会添加到 OP,但您必须尝试一下。我刚刚在我的 Windows 10 机器上打开了%systemroot%\system32\moricons.dll(我使用了nirsoft.net/utils/iconsext.html),发现自己陷入了时间扭曲!它来自Windows 95吗? 3.1?这是梦幻般的!并不是说我会使用它们。
        【解决方案4】:

        在 Visual Studio 中:

        1. 点击文件|打开
        2. 选择 C:\WINDOWS\System32\Shell32.dll

        VS 将使用资源浏览器打开文件。您现在可以查看 shell32.dll 中嵌入的所有图标和其他资源。

        【讨论】:

          【解决方案5】:

          用户选择的图标可以在HKEY_CLASSES_ROOT\Folder\DefaultIcon的注册表中找到

          通过在此处查找值,您还可以了解他们是否出于某种原因对其进行了更改。

          对于存在 desktop.ini 文件的文件夹,您需要阅读 IconFileIconIndex 条目。

          【讨论】:

          • 谢谢。这非常有用。如果可以的话,我会投票两次!
          • 不,请不要使用注册表方法。它没有记录、官方、推荐或允许的官方方式。
          【解决方案6】:

          如果您在 MFC 中,则以下用于加载图标的代码应该可以工作。

          海康海康; hicon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));

          在上面的例子中,AfxGetResourceHandle() 是唯一使用 MFC 的东西,否则据我所知 LoadIcon 是一个 API 调用。

          图标在 windows\system32\shell32.dll 中可用

          如果您安装了 Visual Studio,则 Visual Studio 还附带一组图标,位于“C:\Program Files\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary”这样的路径中

          【讨论】:

            【解决方案7】:

            它可能在 explorer.exe 中。

            【讨论】:

              【解决方案8】:

              简单多了,用资源黑客打开shell32.dll 并右键单击“图标”并将所有图标资源保存在一个目录中。

              您将在该目录中获得所有 Windows 默认图标。

              [链接]http://www.angusj.com/resourcehacker/[/link]

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-08-07
                • 2023-04-02
                • 1970-01-01
                • 1970-01-01
                • 2013-02-04
                • 2017-02-14
                • 1970-01-01
                • 2013-12-17
                相关资源
                最近更新 更多