首页 > 解决方案 > 如何在 Windows 资源管理器的右键菜单(上下文菜单)中添加基于 UWP 的混合应用程序?

问题描述

我们使用 UWP 开发了一个完全信任的文件传输应用程序。它基本上是一个混合应用程序,使用称为应用程序服务的桌面桥功能之一。现在需要将此应用程序添加到 Window 的文件资源管理器右键菜单(上下文菜单)中,如 skype。

在此处输入图像描述

如果我们单击此菜单,应用程序将打开,其中包含我们可以根据需要传输的文件信息。

我们已经尝试了什么?好的,下面是我们尝试过的示例代码。

<com:Extension Category="windows.comServer">
          <com:ComServer>
              <com:SurrogateServer AppId="d0c8bceb-28eb-49ae-bc68-454ae84d6264" DisplayName="My FT">
                  <com:Class Id="d0c8bceb-28eb-49ae-bc68-454ae84d6264" Path="ExplorerCommandVerb.dll" ThreadingModel="STA"/>
              </com:SurrogateServer>
          </com:ComServer>
    </com:Extension>
    <desktop4:Extension Category="windows.fileExplorerContextMenus" Executable="MyFT.exe" EntryPoint="App">
        <desktop4:FileExplorerContextMenus>
            <desktop4:ItemType Type="*">
                <desktop4:Verb Id="Command1" Clsid="d0c8bceb-28eb-49ae-bc68-454ae84d6264" />
            </desktop4:ItemType>
        </desktop4:FileExplorerContextMenus>
    </desktop4:Extension>
  </Extensions>

ExplorerCommandVerb.dll是IExplorerCommand上基于 COM 的 dll 我们对 ExplorerCommandVerb.dll 做了一些修改。就像更改了 CLSID 和名称,如下所示:

void DllAddRef();
void DllRelease();

// use UUDIGEN.EXE to generate unique CLSID values for your objects

class __declspec(uuid("d0c8bceb-28eb-49ae-bc68-454ae84d6264")) CExplorerCommandVerb;
class __declspec(uuid("b3092d57-2ba5-469c-8110-1da4460b8d5b")) CExplorerCommandStateHandler;


static WCHAR const c_szVerbDisplayName[] = L"My FT";
static WCHAR const c_szVerbName[] = L"MyFT.ExplorerCommandStateHandlerVerb";
static WCHAR const c_szProgID[] = L"*";

HRESULT CExplorerCommandStateHandler_RegisterUnRegister(bool Register)
{
   HRESULT hr;
   if (Register)
   {
    // register a create process based verb. this could also be a delegate execute
    // or drop target verb
    CRegisterExtension registerCreateProcess(CLSID_NULL);
    hr = registerCreateProcess.RegisterCreateProcessVerb(c_szProgID, c_szVerbName, L"MyFT.exe %1", c_szVerbDisplayName);
    if (SUCCEEDED(hr))
    {
        hr = registerCreateProcess.RegisterVerbAttribute(c_szProgID, c_szVerbName, L"NeverDefault");
        if (SUCCEEDED(hr))
        {
            // now register the command state handler, this computes if this verb is enabled or not

            CRegisterExtension re(__uuidof(CExplorerCommandStateHandler));

            hr = re.RegisterInProcServer(c_szVerbDisplayName, L"Apartment");
            if (SUCCEEDED(hr))
            {
                hr = re.RegisterExplorerCommandStateHandler(c_szProgID, c_szVerbName);
            }
        }
    }
  }
  else
  {
    // best effort
    CRegisterExtension registerCreateProcess(CLSID_NULL);
    hr = registerCreateProcess.UnRegisterVerb(c_szProgID, c_szVerbName);

    CRegisterExtension re(__uuidof(CExplorerCommandStateHandler));
    hr = re.UnRegisterObject();
  }
  return hr;
}

也许我们在这里做错了什么,这就是没有显示上下文菜单的原因。谁能告诉我有关文件资源管理器上下文菜单添加的详细信息。或者有没有其他方法可以做到这一点?

据我所知,通过添加一些注册表项并在注册表路径(“Computer\HKEY_CLASSES_ROOT\Directory\shell”)中指定 exe 路径,可以轻松地为基于桌面的应用程序添加上下文菜单。但是 uwp 应用程序没有特定的路径,Windows 以某种方式以自己的方式管理它。

由于它是一个文件传输应用程序,因此右键单击选项应该适用于任何文件类型。

我们不需要使用“windows.fileTypeAssociation”打开信息,因为没有什么可播放或编辑的。

我们需要使用“windows.fileExplorerContextMenus”这个扩展。我已经搜索了很长时间,但没有发现任何可行的方法。这就是为什么我在这里发帖征求我们尊敬的专家的意见。

这是微软文档链接

任何形式的帮助都将是可观的。提前致谢。

注意:我们的应用程序的最低 SDK 支持是 2004(20H2),因此您可以建议任何最新的 API(如果可用)。

标签: c#uwpcontextmenuwindows-10-universal

解决方案


推荐阅读