SHOEISHA iD

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

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

UWPアプリ開発の最前線

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

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


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

UWPアプリを自動起動する

自動起動したサンプルアプリとタスクマネージャーの[スタートアップ]
自動起動したサンプルアプリ(左上)と、[スタートアップ]タブを表示しているタスクマネージャー(右下)
  • ログイン時にUWPアプリを最小化状態で自動起動させます
  • ユーザーは、タスクマネージャーなどから自動起動をON/OFFできます
  • Windows 10 version 1709(build 16299)から利用可能

 StartupTaskクラス(Windows.ApplicationModel名前空間)のRequestEnableAsyncメソッドを使うと、Windowsに対してそのUWPアプリを自動起動するように要求できます。また、StartupTaskクラスのDisableメソッドで、自動起動を解除できます。ユーザーはいつでも、タスクマネージャーや設定アプリで自動起動をON/OFFできます。

マニフェストの変更

 アプリから自動起動を要求するには、マニフェストに拡張宣言が必要です。

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

 まず、先頭のPackageタグに名前空間「uap5」を追加します(次のコード)。

マニフェストに名前空間を追加する(Package.appxmanifest
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
  IgnorableNamespaces="uap mp uap5">

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

マニフェストにExtensions要素を追加する(Package.appxmanifest
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="UF12.App">
  <uap:VisualElements DisplayName="UF12" ……省略……>
    ……省略……
  </uap:VisualElements>
  <Extensions>
    <uap5:Extension Category="windows.startupTask" Executable="UF12.exe"
                    EntryPoint="UF12.App">
      <uap5:StartupTask TaskId="UF12StartupId" Enabled="false"
                        DisplayName="UF12 AutoStartup" />
    </uap5:Extension>
  </Extensions>
</Application>

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

  • Executable:実行ファイル名(アセンブリ名+「.exe」)
  • EntryPoint:エントリーポイント(通常はアセンブリ名+「.App」)
  • TaskId:任意のスタートアップタスク識別名(API呼び出し時に使います)
  • DisplayName:任意のスタートアップタスク表示名(タスクマネージャーなどに表示されます)

自動起動を要求するコード

 自動起動を要求するには、StartupTaskオブジェクトを取得してきて、そのRequestEnableAsyncメソッドを呼び出します(次のコード)。StartupTaskオブジェクトを取得するとき、マニフェストに設定したTaskIdを指定します。

自動起動を要求する(MainPage.xaml.AutoStartup.cs
// マニフェストで指定したTaskId
const string StartUpTaskId = "UF12StartupId";

// StartupTaskオブジェクトを得る
StartupTask startupTask = await StartupTask.GetAsync(StartUpTaskId);

// 自動起動を要求する
StartupTaskState state = await startupTask.RequestEnableAsync();
// 返されたstateを見て、実際に自動起動が有効になったかどうかを判定できる

 RequestEnableAsyncメソッドを呼び出すと、次の画像のようなダイアログが表示されます。ここでユーザーが許可すると、実際に自動起動が有効になります。次のログインから、最小化された状態でアプリが自動起動します。

自動起動の許可をユーザーに求めるダイアログ
自動起動の許可をユーザーに求めるダイアログ

 上のダイアログでユーザーが拒否した場合、その後はコードから自動起動を有効にできません。ユーザーは手動で、タスクマネージャーの[スタートアップ]タブか(ページ冒頭の画像を参照)、設定アプリの[アプリ]-[スタートアップ](次の画像)で有効にできます。

設定アプリの[アプリ]-[スタートアップ]
設定アプリの[アプリ]-[スタートアップ]

 なお、アプリから自動起動を停止するには、StartupTaskオブジェクトのDisableメソッドを呼び出します。停止するときには、ダイアログが出ません。

自動起動の状態を調べる

 自動起動が有効になっているか、それとも無効な状態なのか、StartupTaskオブジェクトのStateプロパティで判別できます。サンプルコードでは、その状態に応じてトグルスイッチの状態とその直下のメッセージを変更しています(MainPage.xaml.AutoStartup.csのSetupAutoStartupToggleメソッド)。

 Stateプロパティ(StartupTaskState列挙体)には、次の5つの状態があります。

StartupTaskオブジェクトのStateプロパティ
状態 理由 有効化
Disabled(0) 無効 要求したことがないか、コードで無効にした 要求可能
DisabledByUser(1) 無効 ユーザーが無効にした 要求不可
Enabled(2) 有効 ユーザーが許可した
DisabledByPolicy(3) 無効 グループポリシーで禁止されている 要求不可
EnabledByPolicy(4) 有効 グループポリシーで強制されている

自動起動されたときの処理

 自動起動を有効にしただけでは、アプリは起動しません。自動起動の場合には、通常のOnLaunchedメソッド(Appクラス)ではなく、OnActivatedメソッドが呼び出されるからです。OnActivatedメソッドの引数を調べると、マニフェストに設定したTaskIdが取得できます。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.StartupTask)
  {
    // 自動起動された
    // TaskIdを取得する例
    var startupArgs = args as StartupTaskActivatedEventArgs;
    payload = startupArgs.TaskId;
    // 自動起動時に行う処理があればここに
  }

  rootFrame.Navigate(typeof(MainPage), payload);
  Window.Current.Activate();
}

次のページ
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング