我想确定所有可用的应用程序来打开文件。类似于资源管理器中的“打开方式”上下文。
从注册表项:
HKEY_CLASSES_ROOT\extension\OpenWithProgids
我可以获得我正在寻找的信息。这部分对我来说很清楚。
但我也得到像“AppXea46y3k4tynme684q1dgefbnb0b9r8ec”这样的条目。什么是“CodeWriter”Windows商店应用。
如果我在注册表中查找此条目:
HKEY_CLASSES_ROOT\AppXea46y3k4tynme684q1dgefbnb0b9r8ec
我找到了类似的东西:
HKEY_CLASSES_ROOT\AppXea46y3k4tynme684q1dgefbnb0b9r8ec\Shell\open\command
对于非商店应用程序,我会找到一个shell命令。像:
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE" "%1"
从那里我可以确定程序(写字板),一切都很好。
对于商店应用程序,我找到类似的内容:
此DelegateExecute值与所有商店应用ShellOpenCommands相同。
我想知道我是如何从那里获得可用的OpenCommand的。所以我可以确定它是什么应用程序。
答案 0 :(得分:0)
SHAssocEnumHandlers完成工作。
我找到了C ++的示例实现:
#include "stdafx.h"
#include "Shobjidl.h"
int main(int argc, _TCHAR* argv[])
{
IEnumAssocHandlers *pEnumHandlers = NULL;
if (SUCCEEDED(SHAssocEnumHandlers(L".bmp", ASSOC_FILTER_RECOMMENDED, &pEnumHandlers)))
{
IAssocHandler *pAssocHandler = NULL;
while (S_OK == pEnumHandlers->Next(1, &pAssocHandler, NULL))
{
if (pAssocHandler != NULL)
{
LPWSTR pszName;
LPWSTR pszUIName;
LPWSTR ppszPath;
int pIndex;
pAssocHandler->GetUIName(&pszName);
pAssocHandler->GetName(&pszUIName);
pAssocHandler->GetIconLocation(&ppszPath, &pIndex);
pAssocHandler->Release();
pAssocHandler = NULL;
printf_s("%S \n", pszUIName);
printf_s("%S \n", pszName);
}
}
pEnumHandlers->Release();
scanf_s("%S");
}
return 0;
}
结果如下:
C:\ Program Files(x86)\ Windows Photo Viewer \ PhotoViewer.dll
Windows的Fotoanzeige
C:\ WINDOWS \ SYSTEM32 \ mspaint.exe
油漆
对于C#实现,请参阅: Use SHAssocEnumHandlers in C#