如何使用参数uwp启动.exe app

时间:2017-08-31 09:33:07

标签: uwp exe launch desktop-bridge

我知道我们可以使用LaunchFullTrustProcessForCurrentAppAsync(String)方法 和

<desktop:Extension Category="windows.fullTrustProcess" Executable="fulltrustprocess.exe"> 
  <desktop:FullTrustProcess> 
    <desktop:ParameterGroup GroupId="SyncGroup" Parameters="/Sync"/> 
    <desktop:ParameterGroup GroupId="OtherGroup" Parameters="/Other"/> 
  </desktop:FullTrustProcess> 

 启动并发送参数到win32应用程序。但我的大问题是:如何在我的win32应用程序中接收该参数(在我的情况下,win32应用程序是我的控制台应用程序)。有没有人有任何帮助。谢谢。

Stefan回复更新
在win32应用程序中总是有 Main(string [] args),所以如果另一个应用程序使用参数启动我们的win32 .exe(例如:&#34;我的参数&#34;字符串), args 字符串数组将包含&#34;我的参数&#34;字符串,我确定。

2 个答案:

答案 0 :(得分:2)

更好的选择是使用App Services。

应用服务可以让您在两个应用程序之间来回通信。幸运的是,桌面应用程序存在UWP扩展,可以帮助您在win32项目中使用应用程序服务。以下是步骤。

<强> 1。在Win32应用程序中安装UwpDesktop

Install-Package UwpDesktop

<强> 2。在Win32应用程序中创建App Service端点

    private async void btnConfirm_Click(object sender, EventArgs e)
    {
        AppServiceConnection connection = new AppServiceConnection();
        connection.AppServiceName = "CommunicationService";
        connection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
        var result = await connection.OpenAsync();
        if (result == AppServiceConnectionStatus.Success)
        {
            ValueSet valueSet = new ValueSet();
            valueSet.Add("name", txtName.Text);

            var response = await connection.SendMessageAsync(valueSet);
            if (response.Status == AppServiceResponseStatus.Success)
            {
                string responseMessage = response.Message["response"].ToString();
                if (responseMessage == "success")
                {
                    this.Hide();
                }
            }
        }
    }

如果你的.exe文件是UWP项目的一部分,你的Package.Current.Id.FamilyName应该重定向到UWP的PFN。

第3。在UWP app中创建频道的另一面

现在在您的UWP应用中创建一个基本的应用服务

AppServiceConnection connection = new AppServiceConnection();
connection.AppServiceName = "CommunicationService";
connection.PackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;
connection.RequestReceived += Connection_RequestReceived;
var result = await connection.OpenAsync();

<强> 4。处理连接请求

最后,您需要处理Connection_RequestReceived

中的传入连接
private async void Connection_RequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    var deferral = args.GetDeferral();
    string name = args.Request.Message["name"].ToString();
    Result.Text = $"Hello {name}";
    ValueSet valueSet = new ValueSet();
    valueSet.Add("response", "success");
    await args.Request.SendResponseAsync(valueSet);
    deferral.Complete();
}

虽然我们只返回valueSet只有一个项目,但您可以在valueSet中添加其他项目,如特定说明或参数。这些将在Win32端为您提供。

这是一个非常简单的例子,由官方MSDN博客文章缩小,百年团队在这里找到:

https://blogs.msdn.microsoft.com/appconsult/2016/12/19/desktop-bridge-the-migrate-phase-invoking-a-win32-process-from-a-uwp-app/

为了使其更加强大,您可以确保只有在Win32应用程序启动后才能在UWP端创建应用服务连接,使用AppServiceTriggerDetails,如在博文中

您还需要在 Package.appxmanifest 文件中声明应用服务

<Extensions>
  <uap:Extension Category="windows.appService">
    <uap:AppService Name="CommunicationService" />
  </uap:Extension>
  <desktop:Extension Category="windows.fullTrustProcess" Executable="Migrate.WindowsForms.exe" />
</Extensions>

您可以在此处的博客文章中找到示例:

https://github.com/qmatteoq/DesktopBridge/tree/master/6.%20Migrate

快乐编码。 :)

答案 1 :(得分:2)

参数在Win32进程的Main()函数中作为参数传递。