如何从 WinForm 启动 Windows 通用应用程序

6

我正在尝试使用以下代码从我的Winform运行Windows通用应用程序,但不幸的是它打开了文档文件夹。我在UWP应用程序开发中是新手。这是启动UWP应用程序的正确方法吗?

Process p = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "explorer.exe";
            startInfo.Arguments = @"shell:appsFolder\Microsoft.SDKSamples.CameraAdvancedCapture.CS_8wekyb3d8bbwe!App";
            p.StartInfo = startInfo;
            p.Start();
3个回答

10

您实际上有两个问题:

  1. 如何从WinForms应用程序启动协议?
  2. 如何正确启动UWP应用程序。

要从WinForms应用程序启动协议,请使用带有 UseShellExecute = true 的 Process 对象。不要尝试使用 Explorer.exe 作为进程启动它。

启动应用程序的最佳方法是通过协议,只要该应用程序定义了一个协议即可。如果您控制该应用程序,则可以像 @Romasz 所示那样定义协议:处理 URI 启动

您在命令行中使用的 shell:appsFolder 技巧是很方便的脚本技巧,但它没有记录或保证。不要编写依赖于它的代码。

一旦您拥有一个协议,就可以使用 Process.Start 启动它:

这里是启动 People 应用程序的 shell 技巧:

Process p = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.FileName =  startInfo.FileName =  @"shell:appsFolder\Microsoft.People_8wekyb3d8bbwe!App";
p.StartInfo = startInfo;
p.Start();

由于「People」应用程序定义了一个记录的协议,因此最好使用该方式启动它。这还可以让我们选择自己想要的联系人:

Process p = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.FileName = @"ms-people:viewcontact?PhoneNumber=8675309";
p.StartInfo = startInfo;
p.Start();

启动没有定义协议的UWP应用程序的正确方法是使用IApplicationActivationManager。这是Shell将在内部使用的内容,它可以更好地控制您要启动的内容和方式。

有一个关于如何在C#中使用IApplicationActivationManager的stackoverflow问答,网址为IApplicationActivationManager::ActivateApplication in C#?


2
如果当前用户的机器上阻止了PowerShell并且仅对管理员用户可用,这是否有效? - Ali123

2
你可以使用 自动启动 Windows 10 UWP 应用程序
"C:\Program Files (x86)\Windows Kits\10\App Certification Kit\microsoft.windows.softwarelogo.appxlauncher.exe" MyPackageName_ph1m9x8skttmg!AppId

其中MyPackageName_ph1m9x8skttmg是您的UWP应用程序的Package family name,而AppId则是您的Package.appxmanifest文件下<Applications> xml元素中的Application Id


1
Windows Kits 可供已安装 Windows SDK 进行开发的用户使用。它不会在非开发人员的笔记本电脑上显示。 - Ali123
这个命令救了我的一天,虽然我很难得到应用程序的ID。但是我们可以从UWP项目的Package.apxmanifest -> Package选项卡 -> Package Family Name中获取它。或者运行PowerShell命令get-StartApps | Where-Object {$_.Name -like 'appname'}。 - Varun

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接