c# - 如何在 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(如果可用)。
解决方案
推荐阅读
- .net - 修改“C:\Program Files\dotnet\sdk\NuGetFallbackFolder”文件夹的权限被拒绝
- html - 将 div 放在中心并将图像与其“左侧”对齐
- regex - 正则表达式仅在与其他模式不匹配时才匹配特定模式
- python - 张量的形状
- c++ - 自定义 unary/binaryExpr() eigen3 的参数
- ios - 在客户端应用商店上传应用与 .p12 和 .mobileprovision 连接
- google-apps-script - 在 UNIQUE 公式列出另一个值后更新单元格值
- angular - 无法读取未定义的属性“user_data” - NGRX
- javascript - 带有参数的函数的JavaScript问题
- python-3.x - 校准和保持数据:AttributeError:“int”对象没有属性“n”