【问题标题】:How can I set icons to virtual files in a namespace extension?如何将图标设置为命名空间扩展中的虚拟文件?
【发布时间】:2017-02-25 17:27:48
【问题描述】:

我正在尝试将图标添加到命名空间扩展中的虚拟文件。这些文件是 .docx、.pdf 和其他非 Windows 默认扩展名,但我不清楚如何执行此操作。 IDefaultExtractIconInit::SetNormalIcon(LPCWSTR pszFile, int iIcon) 接受图标的文件路径和图标 ID。调用 SHGetFileInfo 获取图标路径和索引失败返回路径但返回成功。 SHGetFileInfo 会将正确的图标索引返回到系统图标缓存,我想使用它,但是将该索引传递给 SetNormalIcon(NULL, idx) 无法设置正确的图标。如何设置文件图标?

STDMETHODIMP CShellFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv) {
    *ppv        = NULL;
    HRESULT hr  = E_NOTIMPL;
    if (IID_IExtractIcon == riid) {
        IDefaultExtractIconInit *pdxi   = NULL;
        hr                              = SHCreateDefaultExtractIcon(IID_PPV_ARGS(&pdxi));
        if (SUCCEEDED(hr)) {
            BOOL isFolder   = FALSE;
            hr              = m_pPidlMgr->IsFolder(apidl[0], &isFolder);
            if(SUCCEEDED(hr)) {
                pdxi->SetFlags(GIL_FORSHELL);
                hr = pdxi->SetNormalIcon(L"Shell32.dll", isFolder ? 4 : 1);
                if (SUCCEEDED(hr)) 
                    hr = pdxi->QueryInterface(riid, ppv);
            }
            pdxi->Release();
        }
    }
    return hr;
}

【问题讨论】:

    标签: winapi com windows-shell


    【解决方案1】:

    没有真正记录,但是当您将 NULL 作为文件名传递时,索引是SHSTOCKICONID value,而不是系统图像列表索引!您可以在this page 的示例中看到SIID_* 值。如果你只知道系统镜像列表索引,我不确定是否可以使用IDefaultExtractIconInit

    如果您的命名空间扩展 only 从系统图像列表中返回图标,您可能会在 shell 文件夹实现中仅支持 IShellIcon。否则,您可能必须创建一个自定义 IExtractIcon 对象。

    【讨论】:

    • 更简单的方法是将IExtractIcon 委托给文件系统IShellFolder + 一个简单的pidl。
    • 感谢您分享您的专业知识,Raymond。
    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多