如何在 Windows 资源管理器的右键菜单上下文菜单中添加基于 UWP 的混合应用程序?

问题描述

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

enter image description here

如果我们点击这个菜单,应用程序将打开,我们可以根据需要传输文件信息。

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

<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.dllIExplorerCommand. 上基于 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,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;
}

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

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

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

我们不需要使用“windows.fileTypeAssociation”打开信息,因为没有任何东西可以播放或编辑。

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

这是Microsoft doc link

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

注意:我们应用的最低 SDK 支持是 2004(20H2),因此您可以推荐任何可用的最新 API。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)