UWPアプリを自動起動する
![自動起動したサンプルアプリとタスクマネージャーの[スタートアップ]](https://codezine.jp/static/images/article/11325/fig03s.png)
- ログイン時にUWPアプリを最小化状態で自動起動させます
- ユーザーは、タスクマネージャーなどから自動起動をON/OFFできます
- Windows 10 version 1709(build 16299)から利用可能
StartupTaskクラス(Windows.ApplicationModel名前空間)のRequestEnableAsyncメソッドを使うと、Windowsに対してそのUWPアプリを自動起動するように要求できます。また、StartupTaskクラスのDisableメソッドで、自動起動を解除できます。ユーザーはいつでも、タスクマネージャーや設定アプリで自動起動をON/OFFできます。
マニフェストの変更
アプリから自動起動を要求するには、マニフェストに拡張宣言が必要です。
ソリューションエクスプローラーでPackage.appxmanifestを右クリックし、[コードの表示]を選んで、マニフェストを直接編集します。
まず、先頭のPackage
タグに名前空間「uap5」を追加します(次のコード)。
<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要素を追加します。
<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を指定します。
// マニフェストで指定したTaskId const string StartUpTaskId = "UF12StartupId"; // StartupTaskオブジェクトを得る StartupTask startupTask = await StartupTask.GetAsync(StartUpTaskId); // 自動起動を要求する StartupTaskState state = await startupTask.RequestEnableAsync(); // 返されたstateを見て、実際に自動起動が有効になったかどうかを判定できる
RequestEnableAsyncメソッドを呼び出すと、次の画像のようなダイアログが表示されます。ここでユーザーが許可すると、実際に自動起動が有効になります。次のログインから、最小化された状態でアプリが自動起動します。
![自動起動の許可をユーザーに求めるダイアログ](https://codezine.jp/static/images/article/11325/fig04s.png)
上のダイアログでユーザーが拒否した場合、その後はコードから自動起動を有効にできません。ユーザーは手動で、タスクマネージャーの[スタートアップ]タブか(ページ冒頭の画像を参照)、設定アプリの[アプリ]-[スタートアップ](次の画像)で有効にできます。
![設定アプリの[アプリ]-[スタートアップ]](https://codezine.jp/static/images/article/11325/fig05s.png)
なお、アプリから自動起動を停止するには、StartupTaskオブジェクトのDisableメソッドを呼び出します。停止するときには、ダイアログが出ません。
自動起動の状態を調べる
自動起動が有効になっているか、それとも無効な状態なのか、StartupTaskオブジェクトのStateプロパティで判別できます。サンプルコードでは、その状態に応じてトグルスイッチの状態とその直下のメッセージを変更しています(MainPage.xaml.AutoStartup.csのSetupAutoStartupToggleメソッド)。
Stateプロパティ(StartupTaskState列挙体)には、次の5つの状態があります。
値 | 状態 | 理由 | 有効化 |
---|---|---|---|
Disabled(0) | 無効 | 要求したことがないか、コードで無効にした | 要求可能 |
DisabledByUser(1) | 無効 | ユーザーが無効にした | 要求不可 |
Enabled(2) | 有効 | ユーザーが許可した | - |
DisabledByPolicy(3) | 無効 | グループポリシーで禁止されている | 要求不可 |
EnabledByPolicy(4) | 有効 | グループポリシーで強制されている | - |
自動起動されたときの処理
自動起動を有効にしただけでは、アプリは起動しません。自動起動の場合には、通常のOnLaunchedメソッド(Appクラス)ではなく、OnActivatedメソッドが呼び出されるからです。OnActivatedメソッドの引数を調べると、マニフェストに設定したTaskIdが取得できます。OnActivatedメソッドは、次のコードのように記述します。
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(); }