此official MSDN document描述了如何在通用Windows平台(UWP)应用之间共享数据。但是我们是否可以从Windows Forms应用程序向UWP应用程序传递字符串并从Windows Forms应用程序启动UWP应用程序?在这种情况下,我找不到任何文档。我正在使用C#,但是在这种情况下,语言并不重要。
注意:在我们的示例中,这是一个长字符串,其中包含 Windows窗体应用要传递给使用该数据的UWP应用的数据。
答案 0 :(得分:5)
最简单的方法是使用自定义URI方案,然后使用该方案启动应用。
official UWP documentation中对注册和处理自定义URI进行了详细介绍,因此,我建议您遵循该说明。简而言之,您首先在Package.appxmanifest
中注册自定义URI方案,然后在OnActivated
中覆盖App.xaml.cs
,然后检查IActivatedEventArgs.Kind
是否为ActivationKind.Protocol
。然后,将IActivatedEventArgs
强制转换为ProtocolActivatedEventArgs
并使用其Uri
属性访问启动的URI。
在Windows Forms方面,您只需要启动URI,这将导致UWP应用启动/激活。为此,您可以使用URI启动进程:
var url = "myapp:?someparam=somevalue";
var psi = new ProcessStartInfo();
psi.UseShellExecute = true;
psi.FileName = url;
Process.Start(psi);
通过使用URI中的查询字符串参数,您可以使用URI将任何string
值传递给UWP应用。您可以在UWP应用的OnActivated
方法中阅读这些内容。
当然,这不是唯一的解决方案,因为您现在还可以在Windows窗体中使用UWP API,因此您可以例如使用App Services在两个应用程序之间传递数据。但是,如果您只需要单向通信,则可以使用自定义URI。
自版本16226起,UWP支持App Execution Alias,它使您可以声明系统范围的应用程序名称,该名称可用于从命令行从系统中的任何地方启动应用程序。您可以详细了解in this blogpost。这样,您可以直接通过应用名称启动该应用,并将参数作为进程args传递。
答案 1 :(得分:3)
除了@Martin Zikmund的答案; this article解释了如何从命令行启动UWP应用,该操作基本上与Process.Start
相同,但是在脚本编写场景中可能会更容易。并非在所有设备上都适用。
c:\> explorer.exe shell:appsFolder\put-your-PackageFamilyName-here!put-your-app-ID-here
查询字符串附录也应该起作用。
要特别注意如果您自己没有设置参数,如何获取参数:
- 浏览到与PackageFamilyName对应的InstallLocation
- 打开AppxManifest.xml
- 为所需的应用程序查找“ Executable =“。 (由于某些应用程序包中包含多个应用程序,因此邮件和日历在同一包内)
- 在同一行上,找到应用程序的ID
打开邮件应用程序的示例:
explorer.exe shell:appsFolder \ microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.mail