确定使用DelegateExecute打开文件的所有可能应用程序

时间:2018-01-19 16:06:57

标签: c# windows-10 registry file-extension windows-explorer

我想确定所有可用的应用程序来打开文件。类似于资源管理器中的“打开方式”上下文。

从注册表项:

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"

从那里我可以确定程序(写字板),一切都很好。

对于商店应用程序,我找到类似的内容:

enter image description here

此DelegateExecute值与所有商店应用ShellOpenCommands相同。

我想知道我是如何从那里获得可用的OpenCommand的。所以我可以确定它是什么应用程序。

1 个答案:

答案 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#