UWPアプリから外部プログラムを起動するにはDesktop BridgeのFullTrustProcessLauncherクラスを用います。外部プログラムを起動する際に引数を渡すことも可能であり、ここではその方法を説明します。
[toc]UWPアプリから外部プログラムに引数を渡して実行する方法
Desktop Bridgeを使えば、UWPアプリからFullTrustProcessLauncherを用いて外部プログラムを起動することができます。(詳細は以下の記事をご覧ください)
ここで起動するプログラムはあらかじめアプリのマニフェストに登録しておく必要がありますが、この時外部プログラムに渡す引数もマニフェストに登録しておくことで、その引数を渡すことも可能になります。
Desktop BridgeではマニフェストのApplication要素内にExtensions要素で外部プログラムについての情報を記述しますが、その中に以下のようにParameterGroup要素で必要なだけGroupIdとParametersの組み合わせを指定できます。
Package.appxmanifest
<Extensions>
<desktop:Extension Category="windows.fullTrustProcess" Executable=...(外部プログラム)...>
<desktop:FullTrustProcess>
<desktop:ParameterGroup GroupId="グループID-1" Parameters="パラメーター"/>
<desktop:ParameterGroup GroupId="グループID-2" Parameters="パラメーター"/>
...(省略)...
</desktop:FullTrustProcess>
</desktop:Extension>
</Extensions>
LaunchFullTrustProcessForCurrentAppAsyncメソッドで外部プログラムを実行する際はその引数にGroupIdで対応するParametersを指定します。複数の引数(パラメーター)を指定する場合はスペース区切りとします。
なおここでは、あらかじめ外部プログラムの引数の組み合わせをマニフェストに記述しておく必要があるため、「プログラムの処理に応じて動的に引数を設定する」というようなことはできないという制限があります。
サンプルアプリの概要
サンプルアプリとして、UWPアプリのボタンをクリックすることで、それぞれ異なる引数を渡して外部プログラムを起動するアプリを作成してみます。ここでは外部プログラムに渡された引数が分かりやすいように標準出力に表示させるプログラムとしていますが、実際には受け取った引数に応じて場合分けをしたりという使い方になると思います。
サンプルアプリの作成
プロジェクトを作成する
以下の記事に従ってDesktop Bridge用のプロジェクトを作成していきます。
まず、新規の「Windowsアプリケーションパッケージプロジェクト」を「AppLauncher」というプロジェクト名で作成し、ソリューションに次の2つのプロジェクトを追加します。
- 空白のアプリ(ユニバーサルWindows)
- ここでは「UWPApp」とします
- コンソールアプリケーション
- ここでは「ConsoleApp」とします
AppLauncherプロジェクトの「アプリケーション」に上記の2つのプロジェクトを追加しておき、UWPAppの方をエントリポイントに設定します。続いて、AppLauncherプロジェクトのPackage.appxmanifestを右クリックして、コードの表示からコードを表示させ、以下のハイライト部分を追加します。
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
IgnorableNamespaces="uap rescap">
......省略......
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="AppLauncher"
Description="AppLauncher"
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<desktop:Extension Category="windows.fullTrustProcess" Executable="ConsoleApp\ConsoleApp.exe">
<desktop:FullTrustProcess>
<desktop:ParameterGroup GroupId="Command1" Parameters="command1"/>
<desktop:ParameterGroup GroupId="Command2" Parameters="command2 parameter"/>
</desktop:FullTrustProcess>
</desktop:Extension>
</Extensions>
</Application>
</Applications>
......省略......
</Package>
25-32行目でExtensions要素のExtensionの1つとして起動する外部プログラムを指定し、FullTrustProcessのParameterGroupに以下の2つを指定します(28-29行目)。
- GroupId:Command1、Parameters:command1
- GroupId:Command2、Parameters:command2 parameter
最後にUWPAppプロジェクトの参照の追加から「Windows Desktop Extenshons for the UWP」のチェックを入れて、Desktop Bridgeを有効化しましょう。
なお、実行する際はソリューションのプラットフォームをx86かx64のいずれかにする必要があります。
UWPアプリのコーディング
MainPage.xaml
<Page ...(省略)...">
<StackPanel>
<Button x:Name="btn1" Content="コマンド1" Click="btn1_Click"/>
<Button x:Name="btn2" Content="コマンド2" Click="btn2_Click"/>
</StackPanel>
</Page>
MainPage.xaml.cs
using System;
using Windows.ApplicationModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace UWPApp
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
//コマンド1ボタンを押したときの処理
private async void btn1_Click(object sender, RoutedEventArgs e)
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("Command1");
}
//コマンド2ボタンを押したときの処理
private async void btn2_Click(object sender, RoutedEventArgs e)
{
await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("Command2");
}
}
}
外部プログラムの起動にはFullTrustProcessLauncherクラスのLaunchFullTrustProcessForCurrentAppAsyncメソッドを用いますが、その引数にPackage.appxmanifestに指定したParameterGroupのGroupIdを指定することで、対応するParameterGroupのParametersを外部プログラムに渡すことが可能になります。
ここでは、「コマンド1」ボタンを押したときの処理として18行目でLaunchFullTrustProcessForCurrentAppAsyncメソッドの引数に”Command1″を指定しています。これにより外部プログラムにはPackage.appxmanifestの28行目で指定している「command1」という文字列が渡されます。また、「コマンド2」ボタンを押したときの処理として24行目でLaunchFullTrustProcessForCurrentAppAsyncメソッドの引数に”Command2″を指定しています。これにより外部プログラムにはPackage.appxmanifestの29行目で指定している「command2 parameter」という文字列が渡されます(外部プログラム側では「command2」「parameter」の2つのパラメーターとして解釈されます)。
外部プログラムのコーディング
Program.cs
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
//引数として取得したパラメーターargsを1つずつ取得し、標準出力に1行ずつ出力する
foreach(string arg in args)
{
Console.WriteLine(arg);
}
Console.ReadLine();
}
}
}
UWPアプリから起動する外部プログラムは受け取った引数を標準出力に表示させるプログラムとします。
FullTrustProcessLauncherクラスから起動したプログラムでは引数argsに何も指定しなくても以下のようになります。
- args[0]:”/InvokerPRAID:”
- args[1]:”App”
3番目の引数からプログラム実行時に指定した引数が割り当てられるので、「コマンド1」ボタンを押した場合はargs[2]が「command1」となり、「コマンド2」ボタンを押した場合はargs[2]が「command2」、args[3]が「parameter」となります。
コメント