我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗

Posted

技术标签:

【中文标题】我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗【英文标题】:Can I load a default windows icon depending on different system from somewhere in the sytem files 【发布时间】:2013-09-30 06:23:42 【问题描述】:

具体来说,我正在尝试编写一个在不同的 Windows 系统上运行的 Windows 程序,主要是 XP 和 Win7 或 Win8。我希望它从系统文件中的某处加载系统默认图标(我也不知道)。这可能吗?我该怎么做?

例如,Text.txt 文件在 Windows XP 上有它的图标,但在 Win7 上有不同的图标。 XP的回收站也不同于Win7的回收站。那么我在哪里可以将这个与系统相关的图标加载到我的程序中呢? ps 我使用的是 VC6,而不是 .NET。

【问题讨论】:

参见例如SHGetStockIconInfo(虽然在 XP 上不可用,但它可能会提示您要查找的内容。) 【参考方案1】:

如果您想要特定类型文件的图标,您可以使用SHGetFileInfo。例如,获取文本文件的图标:

SHFILEINFO sfi;
if (SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES ))

    // you now have the icon in sfi.hIcon
    // remember to destroy it when you are done with it
    DestroyIcon(sfi.hIcon);

SHGFI_ICON 标志表示我们想要大图标。您可以添加SHGFI_SMALLICON 标志来获取小图标。

SHGFI_USEFILEATTRIBUTES 表示我们传递的文件名不必存在 - 该函数将返回文件类的图标,而不是特定现有文件的图标。如果您想要特定文件的图标,则将文件的完整路径名传递给 SHGetFileInfo 函数并省略此标志。

如果你想要一个系统文件夹的图标,比如回收站,这个功能也可以做到。例如:

LPITEMIDLIST pidl;
if (SUCCEEDED(SHGetFolderLocation(0, CSIDL_BITBUCKET, 0, 0, &pidl)))

    SHFILEINFO sfi;
    if (SHGetFileInfo((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_PIDL))
    
        // you now have the icon in sfi.hIcon
        // remember to destroy it when you are done with it
        DestroyIcon(sfi.hIcon);
    
    CoTaskMemFree(pidl);

请参阅SHGetFileInfo 的文档以获取完整的标志列表。在使用这些函数之前,请确保您已调用 OleInitialize()CoInitializeEx() 来初始化 COM。

【讨论】:

非常感谢!我是编程新手。我是否使用 LoadIcon(NULL, LPCTSTR) 函数将 sfi.hIcon 加载到我的程序中?但是如何转换第二个参数呢? 不,sfi.hIcon 已经加载 - 您可以在像 DrawIconEx() 这样的调用中使用它。 此外,我认为我的 VC6 太旧了,因此在编译时,它说 SHGetFolderLocation 是未声明的标识符,并且 SHGetFileInfoA 也无法将参数 1 从“const unsigned short *”转换为“const char *”。有什么解决办法吗?? 我不想画它。我想用它作为我程序的图标。我只从资源中知道 LoadIcon。但是不知道如何加载这个 sfi.hIcon 作为我程序的图标? 如果你想用它作为你程序的图标,你应该在你的问题中说,因为这是一个完全不同的主题。您不能以编程方式执行此操作 - 程序的图标存储在 EXE 文件本身的资源中。

以上是关于我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在Xamarin viewcell或Grid或某处显示默认文件扩展名图标?

装daemon tools 或者 Virtual CloneDrive 无法加载光盘映像,也看不到虚拟的盘符,我的系统是win7 32位

win7系统默认图片查看器在哪个文件夹里

ASP.Net网站 未能加载文件或程序集 每次发布网站提示不同的程序集名 我使用VS2010,.Net3.5框架,32位的Win7

Windows双系统

WIn10系统软件默认安装c盘后消失看不见问题