SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

UWPアプリの自動起動/再起動/事前起動/コマンドラインから起動/終了キャンセル
~コードからアプリの起動と終了を制御する

UWPアプリ開発の最前線 第12回


  • X ポスト
  • このエントリーをはてなブックマークに追加

UWPアプリをコマンドラインから起動できるようにする

バッチファイルから起動したサンプルアプリ
バッチファイルから起動したサンプルアプリ(左上)
コンソール(右下)には「8」という終了コードが表示されている
  • コンソールやバッチファイルからUWPアプリを起動できます
  • コマンドライン引数を渡せます。終了コードも返せます
  • Windows 10 version 1709(build 16299)から利用可能

 マニフェストにwindows.appExecutionAlias拡張宣言を追加すると、コマンドラインからUWPアプリを起動できるようになります。

マニフェストの変更

 コマンドラインから起動できるUWPアプリにするには、マニフェストに拡張宣言が必要です。

 ソリューションエクスプローラーでPackage.appxmanifestを右クリックし、[コードの表示]を選んで、マニフェストを直接編集します。

 まず、先頭のPackageタグに名前空間「uap5」を追加します。自動起動と同じですので、実際のコードは2ページ目を参照してください。

 次に、uap:VisualElements要素の後ろに、次のコードのようにExtensions要素を追加します。

マニフェストにExtensions要素を追加する(Package.appxmanifest
<Applications>
  <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="UF12.App">
    <uap:VisualElements DisplayName="UF12" ……省略……>
      ……省略……
    </uap:VisualElements>
    <Extensions>
      <uap5:Extension Category="windows.appExecutionAlias"
                      Executable="UF12.exe" EntryPoint="UF12.App">
        <uap5:AppExecutionAlias>
          <uap5:ExecutionAlias Alias="UF12.exe"/>
          <uap5:ExecutionAlias Alias="UF12AnotherAlias.exe"/>
        </uap5:AppExecutionAlias>
      </uap5:Extension>
    </Extensions>
  </Application>
</Applications>

 設定する値は、次のようになります。

  • Executable:実行ファイル名(アセンブリ名+「.exe」)
  • EntryPoint:エントリーポイント(通常はアセンブリ名+「.App」)
  • ExecutionAlias:コマンドラインから起動するときに使う名前(通常は実行ファイル名)

 ExecutionAliasは、上の例のように複数指定できます。拡張子「.exe」は必須です。コマンドラインからは、どの名前でも起動できます。上の画像のバッチファイルの中では、「UF12AnotherAlias」の方で起動しています。

コマンドラインから起動されたときの処理

 マニフェストに指定しただけでは、アプリは起動しません。自動起動の場合と同じく、通常のOnLaunchedメソッド(Appクラス)ではなく、OnActivatedメソッドが呼び出されるからです。OnActivatedメソッドは、次のコードのように記述します。

自動起動の初期化処理(App.xaml.cs
protected override void OnActivated(IActivatedEventArgs args)
    {
      Frame rootFrame = Window.Current.Content as Frame;
      if (rootFrame == null)
      {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
      }
    
      string payload = string.Empty; // 最初の画面に渡すパラメーター
      if (args.Kind == ActivationKind.CommandLineLaunch)
      {
        // コマンドラインから起動された
        var startupArgs = args as CommandLineActivatedEventArgs;
        var operation = startupArgs.Operation;

        // 起動ディレクトリ
        string activationPath = operation.CurrentDirectoryPath;
        // コマンライン引数
        payload = operation.Arguments;

        // コマンドラインから起動された時に行う処理があればここに

        // 終了コードを設定する例
        operation.ExitCode = payload.Length;
      }
    
      rootFrame.Navigate(typeof(MainPage), payload);
      Window.Current.Activate();
    }

 このOnActivatedメソッドを抜けると、コマンドライン側に制御が戻ります。終了コードをコマンドライン側に返したいときは、OnActivatedメソッドを抜ける前にExitCodeプロパティに設定します。

 なお、CurrentDirectoryPathで起動ディレクトリを取得できますが、通常はアプリからそのディレクトリ内のファイルにアクセスできません。サイドローディングで配布する業務アプリなら、ファイルの「フルアクセス機能」を使えばアクセスできます。

次のページ
UWPアプリが閉じられるのをキャンセルする

関連リンク

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11325 2019/07/22 18:45

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング