c++ - 给定 KNOWNFOLDERID 或其 GUID 获取 Windows 下的关联图标

标签 c++ windows winapi

寻找一种使用 C++ 获取与桌面快捷方式关联的图标的方法,当我只有它的 GUID 时 - 类似于 {82A74AEB-AEB4-465C-A014-D097EE346D63} 或其 KNOWNFOLDERID

最佳答案

像这样的东西,基于 IShellItemImageFactory自 Windows Vista 以来存在的界面:

CoInitialize(NULL);
{
    CComPtr<IKnownFolderManager> mgr;
    if (SUCCEEDED(mgr.CoCreateInstance(CLSID_KnownFolderManager)))
    {
        CComPtr<IKnownFolder> folder;
        if (SUCCEEDED(mgr->GetFolder(FOLDERID_ControlPanelFolder, &folder)))
        {
            CComHeapPtr<ITEMIDLIST> pidl;
            // I pass 0 for flags here, but mileage may differ
            if (SUCCEEDED(folder->GetIDList(0, &pidl)))
            {
                CComPtr<IShellItemImageFactory> factory;
                if (SUCCEEDED(SHCreateItemFromIDList(pidl, IID_PPV_ARGS(&factory))))
                {
                    // you can vary size and SIIGBF flags
                    HBITMAP bmp = nullptr;
                    SIZE size = { 256, 256 };
                    if (SUCCEEDED(factory->GetImage(size, SIIGBF_ICONONLY, &bmp)))
                    {
                        // etc...
                        DeleteObject(bmp);
                    }
                }
            }
        }
    }
}
CoUninitialize();

还有更好的方法使用 SHCreateItemInKnownFolder function :
CoInitialize(NULL);
{
    CComPtr<IShellItemImageFactory> factory;
    if (SUCCEEDED(SHCreateItemInKnownFolder(FOLDERID_ControlPanelFolder, 0, NULL, IID_PPV_ARGS(&factory))))
    {
        // you can vary size and SIIGBF flags
        HBITMAP bmp = nullptr;
        SIZE size = { 256, 256 };
        if (SUCCEEDED(factory->GetImage(size, SIIGBF_ICONONLY, &bmp)))
        {
            // etc...
            DeleteObject(bmp);
        }
    }
}
CoUninitialize();

请注意,这将使您将图标作为 HBITMAP。

关于c++ - 给定 KNOWNFOLDERID 或其 GUID 获取 Windows 下的关联图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61661538/

相关文章:

c++ - 计算 Windows 中的 NTFS 和 FAT 文件系统大小

sockets - 来自特定网卡的 UDP 组播

c++ - 具有类 X 的命名空间 X 中的模板类 Y 无法在 VS2010 中编译

c++ - 链表析构函数风格

java - 包含 PhpStorm 2017.2.2 和 JRE 时内存不足(x64 版本)

C++ 并将枚举值写入 Windows 注册表

windows - 在 Windows 上配置静态路由

c++ - 删除虚拟调用

c++ - 在引用中存储指向类的指针

Python27 - 在 Windows 10 上我怎么知道打印纸尺寸是 50.8mm x 25.4mm?