在尝试实现“打开方式”功能时,我遇到了从 UWP 应用程序提取图标的问题。因此,在收到推荐的应用程序列表后,借助以下命令打开特定文件SHAssocEnumHandlers,我试图在以下命令的帮助下提取每个应用程序的图标IAssocHandler::GetIconLocation和古典的ExtractIcon()
。例如,使用 Paint 等程序一切正常。我有 Paint 二进制文件的完整路径,可以从中提取图标。但对于“3D builder”、“照片”等应用程序和其他 UWP 应用程序获得的图标位置看起来像@{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png}
。我尝试了几个不同的 API 来提取图标,每次都会收到 FILE_NOT_FOUND 错误。那么,有人能给我提示在这种情况下可以使用哪个函数来提取图标吗?
UPDATE添加了源代码的某些部分以澄清情况:
// m_handlers is a member of type std::vector<CComPtr<IAssocHandler>>
HRESULT FileManager::GetAssocHandlers(const std::wstring& strFileExtension, ASSOC_FILTER filter)
{
HRESULT hr = S_OK;
CComPtr<IEnumAssocHandlers> enumerator;
m_handlers.clear();
hr = SHAssocEnumHandlers(strFileExtension.c_str(), filter, &enumerator);
if (SUCCEEDED(hr))
{
for (CComPtr<IAssocHandler> handler;
enumerator->Next(1, &handler, nullptr) == S_OK;
handler.Release())
{
m_handlers.push_back(handler);
}
}
return hr;
}
HRESULT FileManager::GetAssociatedPrograms(BSTR bstrFileName, BSTR* bstrRet)
{
...
hr = GetAssocHandlers(strFileExtension, ASSOC_FILTER_RECOMMENDED);
if (SUCCEEDED(hr))
{
...
for (auto& handler : m_handlers)
{
...
if (SUCCEEDED(handler->GetIconLocation(&tmpStr, &resourceIndex)))
{
// And this is where I get classic full file path to regular
// applications like "MS Paint" or this weird path mentioned
// above for "Photos" UWP application for example which can't
// be used in regular ExtractIcon functions.
}
}
}
}
看来我已经找到了解决方案。为UWP应用程序提供的图标位置路径根据MSDN称为“间接字符串”。我们可以将这个间接字符串传递给SH加载间接字符串函数并将收到图标 PNG 文件的常规完整路径。就我而言,通过后@{Microsoft.Windows.Photos_16.511.8630.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.Windows.Photos/Files/Assets/PhotosAppList.png}
到 SHLoadIndirectString() 我收到了这样的路径:C:\Program Files\WindowsApps\Microsoft.Windows.Photos_16.511.8630.0_neutral_split.scale-125_8wekyb3d8bbwe\Assets\PhotosAppList.scale-125.png
之后我可以使用它来显示图标本身,没有任何问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)