如何使用参数 uwp 启动 .exe 应用程序
How to launch .exe app with parameter uwp
我知道我们可以使用 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),因此如果另一个应用程序使用参数(例如:"my parameter" 字符串)启动我们的 win32.exe,args 字符串数组将包含 "my parameter" 字符串,我确定。
更好的选择是使用应用服务。
应用服务可以让您在两个应用程序之间来回通信。幸运的是,存在一个用于桌面应用程序的 UWP 扩展,它可以帮助您在 win32 项目中使用应用程序服务。下面是步骤。
1.在您的 Win32 应用程序中安装 UwpDesktop
Install-Package UwpDesktop
2。在您的 Win32 应用中创建一个应用服务端点
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 端提供给您。
这是一个非常简单的示例,由 centennial 团队从 MSDN 官方博客 post 缩小而来:
为了使其更健壮,您可以确保仅在 Win32 应用程序启动后才在 UWP 端创建应用程序服务连接,方法是使用 AppServiceTriggerDetails
,如博客 post
您还需要在Package.appxmanifest文件
中声明应用服务
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="CommunicationService" />
</uap:Extension>
<desktop:Extension Category="windows.fullTrustProcess" Executable="Migrate.WindowsForms.exe" />
</Extensions>
您可以在此处的博客 post 中找到示例:
https://github.com/qmatteoq/DesktopBridge/tree/master/6.%20Migrate
快乐编码。 :)
参数在 Win32 进程的 Main() 函数中作为参数传递。
我知道我们可以使用 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),因此如果另一个应用程序使用参数(例如:"my parameter" 字符串)启动我们的 win32.exe,args 字符串数组将包含 "my parameter" 字符串,我确定。
更好的选择是使用应用服务。
应用服务可以让您在两个应用程序之间来回通信。幸运的是,存在一个用于桌面应用程序的 UWP 扩展,它可以帮助您在 win32 项目中使用应用程序服务。下面是步骤。
1.在您的 Win32 应用程序中安装 UwpDesktop
Install-Package UwpDesktop
2。在您的 Win32 应用中创建一个应用服务端点
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 端提供给您。
这是一个非常简单的示例,由 centennial 团队从 MSDN 官方博客 post 缩小而来:
为了使其更健壮,您可以确保仅在 Win32 应用程序启动后才在 UWP 端创建应用程序服务连接,方法是使用 AppServiceTriggerDetails
,如博客 post
您还需要在Package.appxmanifest文件
中声明应用服务<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="CommunicationService" />
</uap:Extension>
<desktop:Extension Category="windows.fullTrustProcess" Executable="Migrate.WindowsForms.exe" />
</Extensions>
您可以在此处的博客 post 中找到示例:
https://github.com/qmatteoq/DesktopBridge/tree/master/6.%20Migrate
快乐编码。 :)
参数在 Win32 进程的 Main() 函数中作为参数传递。