如何从 mime 类型获取系统文件图标?

How to get the system file icon from a mime type?

提问人:Tahtu 提问时间:10/25/2023 最后编辑:IInspectableTahtu 更新时间:10/25/2023 访问量:108

问:

我正在开发 Windows 应用程序,接收电子邮件。同时,我想在下载附件之前显示附件的图标。在那一刻,我有一个 MimeType。

有没有办法仅从 MimeType 获取系统图标?

下载附件后,我可以使用 SHGetFileInfo,但我希望在下载之前拥有图标。

C# .NET Windows WinAPI

评论

1赞 Misaz 10/25/2023
在临时文件夹中,创建具有所需扩展名的空文件。然后使用 .SHGetFileInfo
1赞 Dmitry 10/25/2023
另请参阅 codeproject.com/Articles/29137/...
0赞 Dmitry 10/25/2023
还有 stackoverflow.com/a/616947/2878550
0赞 IInspectable 10/25/2023
@Misaz 这仅仅避免了解决真正的问题:如何确定 MIME 类型的文件扩展名?
0赞 Simon Mourier 10/26/2023
图标应该以什么大小(以像素为单位)?

答:

-2赞 Muhammad Subhan Mehmood 10/25/2023 #1

是的,您可以检索特定文件类型(由 MIME 类型确定)的系统图标,而无需实际将文件放在磁盘上。要在 Windows 上实现此目的,您可以将该函数与标志一起使用。SHGetFileInfoSHGFI_USEFILEATTRIBUTES

下面是 C++ 中的一个简短示例:

#include <Windows.h>
#include <ShlObj.h>

HICON GetIconForMimeType(const wchar_t* mimeType) {
    SHFILEINFO sfi;
    memset(&sfi, 0, sizeof(sfi));

    // Use the SHGFI_USEFILEATTRIBUTES flag to specify that we are providing a file type (MIME type)
    SHGetFileInfo(mimeType, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);

    // Check if the function succeeded in getting the icon
    if (sfi.hIcon)
        return sfi.hIcon;

    // Return a default icon if the function fails
    return LoadIcon(nullptr, IDI_APPLICATION);
}

int main() {
    // Example: Get icon for a JPEG image (change the MIME type accordingly)
    const wchar_t* mimeType = L"image/jpeg";
    HICON icon = GetIconForMimeType(mimeType);

    // Now you can use the 'icon' handle as needed (e.g., display it in your application)
    // ...

    // Don't forget to clean up the icon handle when you're done with it
    DestroyIcon(icon);

    return 0;
}

替换为附件的 MIME 类型。此代码检索与指定文件类型关联的图标,而无需磁盘上的实际文件。image/jpeg

确保包含必要的标头 ( 和 ) 并链接到所需的库。Windows.hShlObj.h

请记住在应用程序中适当地处理错误和边缘情况。

评论

0赞 IInspectable 10/25/2023
这个答案的作者是谁?显然,您过去曾剽窃过内容。
0赞 Tahtu 10/25/2023
这对我的 mimetypes 不起作用。但是通过使用基于文件名显示正确的图标,即使文件也不存储在文件系统中。谢谢。SHGFI_USEFILEATTRIBUTES