在哪里可以找到用于文件夹和应用程序的默认图标?

时间:2009-01-20 11:48:40

标签: c++ windows winapi

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

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

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

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

我真的需要这个在多个Windows操作系统上运行:2000,XP,Vista,2008


感谢您的帮助。我在Vista上看过Shell32.dll。我没有在其中看到与浏览器中的应用程序显示的默认图标相同的图标。我可能会错过它 - 有278个图标需要查看 - 它肯定在那里,还是有其他位置我应该看看?

8 个答案:

答案 0 :(得分:13)

使用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 / exes中提取图标,则可能会因为受版权保护而陷入法律纠纷。

答案 1 :(得分:7)

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

  显示可用图标的

Archive MSDN文档

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

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

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

  

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

答案 2 :(得分:2)

我认为他们在%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的图标可能与同一图标的完整分辨率版本不同。

答案 3 :(得分:2)

在Visual Studio中:

  1. 点击文件|打开
  2. 选择 C:\ Windows \ System32下\的Shell32.dll
  3. VS将使用资源管理器打开该文件。您现在可以查看所有图标和图标。 shell32.dll中嵌入的其他资源。

答案 4 :(得分:2)

用户选择的图标可以在HKEY_CLASSES_ROOT\Folder\DefaultIcon

的注册表中找到

通过在这里查找值,如果他们因任何原因改变了它,你也会接受它。

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

答案 5 :(得分:1)

如果您在MFC中,则下列加载图标的代码应该有效。


    HICON hicon;
    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”

答案 6 :(得分:-1)

它可能在explorer.exe中。

答案 7 :(得分:-1)

它更容易,只需用资源黑客打开shell32.dll 然后右键单击“ICONS”并将所有图标资源保存在目录中。

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

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