我们使用 UWP 开发了一个完全信任的文件传输应用程序。它基本上是一个混合应用程序,使用称为应用程序服务的桌面桥功能之一。现在需要将此应用程序添加到 Window 的文件资源管理器右键菜单(contextmenu)中,例如 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(如果有)。
我也用同样的ExplorerCommandVerb.dll,自己也做了一些修改,但是我很想知道如何实现多级菜单,比如有一个一级菜单Menu One,里面有两个二级菜单-级别菜单菜单 t1 和菜单 t2。我现在也遇到这个问题了,请问如何解决呢?