在上一篇文章中, 我们实现了使用命令行来启动 UWP 应用, 在这一篇文章中, 我们会实现 UWP 应用自启用的实现, 也即开机后或用户登陆后, 应用自己启动这些特性原来都是 Win32 程序所具备的, UWP 能够支持这些特性使得它和 Win32 程序的行为进一步相同
实现
与实现命令行启动一样, 实现自启动也大体上分为两步: 首先, 在 Package.appxmanifest 中添加 windows.startupTask 扩展(Extension); 然后, 在 App 类中处理 OnActivated 事件事实上, 除了这两步外, 我们还需要增加检查 StartupTask 的状态并允许用户控制自启动的逻辑
1. 修改 Package.appxmanifest
右击项目中的 Package.appxmanifest 文件, 在快捷菜单中选择打开方式 ->XML 文本编辑器打开后, 对它的内容按以下修改:
- <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">
- ...
- <Applications>
- <Application
- ...
- <Extensions>
- <uap5:Extension Category="windows.startupTask" EntryPoint="AppAutoRun.App" Executable="AppAutoRun.exe">
- <uap5:StartupTask DisplayName="AppAutoRun" Enabled="true" TaskId="AppAutoRun"/>
- </uap5:Extension>
- </Extensions>
- </Application>
- </Applications>
- </Package>
上述加粗的部分就是添加的扩展 windows.startupTask, 其 EntryPoint 和 Executable 属性分别指明 App 类的完整名称以及当前应用的 exe 名称
在 Extension 节点中, 添加了一个节点 StartupTask, 它有三个属性, 说明如下:
TaskId: 任务 Id, 必填, 在所有的 UWP 应用中, 它必须是唯一的, 不能和其它应用的 TaskId 相同;
Enabled: 是否启用, 必填, 指明是否启用当前应用为自启动行为;
DisplayName: 显示名称, 可选, 在任务管理器中启动选项卡中的显示名称;
需要说明的是, Enabled 属性应该设置为 false; 事实上这个属性会被忽略; 因为 UWP 要实现自启动, 至少需要启动一次, 并且向用户请求同意才行另外目前只能添加一个 StartupTask 节点
此时, 可以将应用部署 (Deploy) 到本机上, 然后, 在任务管理器中启动选项卡上, 我们就可以看到了
这里, 右击每个任务, 可以对它的状态进行控制(启用 / 禁用), 可以看到当前应用的状态是已禁用注意, 在设置它的状态之前, App 需要至少被启动过一次否则这里的设置是不起作用的
2. 查看并更改任务状态
除了在 Package.appxmanifest 中增加扩展外, 我们还需要使用相关的 API 来查看所添加的 StartupTask 的状态, 以及对它的更改在 MainPage.xaml 中增加以下代码:
- <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
- <Grid Margin="12">
- <StackPanel>
- <TextBlock x:Name="tbState" />
- <Button
- x:Name="btnSetState"
- Margin="0,4,0,0"
- Click="btnSetState_Click" />
- </StackPanel>
- </Grid>
- </Grid>
在 MainPage.xaml.cs 中增加以下代码:
- private async void MainPage_Loaded(object sender, RoutedEventArgs e)
- {
- await LoadState();
- }
- public async Task LoadState()
- {
- var task = await StartupTask.GetAsync("AppAutoRun");
- this.tbState.Text = $"Status: {task.State}";
- switch (task.State)
- {
- case StartupTaskState.Disabled:
- // 禁用状态
- this.btnSetState.Content = "启用";
- this.btnSetState.IsEnabled = true;
- break;
- case StartupTaskState.DisabledByPolicy:
- // 由管理员或组策略禁用
- this.btnSetState.Content = "被系统策略禁用";
- this.btnSetState.IsEnabled = false;
- break;
- case StartupTaskState.DisabledByUser:
- // 由用户手工禁用
- this.btnSetState.Content = "被用户禁用";
- this.btnSetState.IsEnabled = false;
- break;
- case StartupTaskState.Enabled:
- // 当前状态为已启用
- this.btnSetState.Content = "已启用";
- this.btnSetState.IsEnabled = false;
- break;
- }
- }
- private async void btnSetState_Click(object sender, RoutedEventArgs e)
- {
- var task = await StartupTask.GetAsync("AppAutoRun");
- if (task.State == StartupTaskState.Disabled)
- {
- await task.RequestEnableAsync();
- }
- // 重新加载状态
- await LoadState();
- }
我们通过 StartupTask 类 (位于 Windows.ApplicationModel 命名空间下) 的 GetAsync 来获取指定 TaskId 的自启动任务(StartupTask)StartupTask 类具有一个 State 的枚举属性, 用于表示其状态它们的值及其意义, 在注释中已经说明
补充说明以下几点:
最开始时, 任务的 State 是 Disabled;
唯有当其 State 是 Disabled 时, 才能以编程的方式使用启动;
当其 State 是 DisabledByUser 或 DisabledByPolicy, 需要经由用户手工启动;
不支持以编程的方式使其 State 成为 Disabled;
通过 StartupTask 类的 RequestEnableAsync 方法, 可以向用户请求将其启动, 调用这个方法后, 会弹出如下窗口:
当用户选择启用后, 下次系统启动后它就会自动启动, 反之, 如果选择禁用, 那么它的状态会是 DisabledByUser 要想启用它, 就需要打开任务管理器, 在启动选项卡上右击它, 选择启用
3. 处理 OnActivated 事件
然后, 在 App 类的 OnActivated 事件上增加对 ActivationKind 类的判断, 并作相应的处理即可代码如下:
- protected override void OnActivated(IActivatedEventArgs args)
- {
- Frame rootFrame = Window.Current.Content as Frame;
- if (rootFrame == null)
- {
- rootFrame = new Frame();
- Window.Current.Content = rootFrame;
- }
- if (args.Kind == ActivationKind.StartupTask)
- {
- var startupArgs = args as StartupTaskActivatedEventArgs;
- }
- rootFrame.Navigate(typeof(MainPage), args.Kind);
- Window.Current.Activate();
- }
最后, 要注意的是: 如果启用了自启动, 当系统启动后, 应用会以最小化的方式启动
参考资料:
Configure your app to start at log-in
来源: http://www.bubuko.com/infodetail-2495968.html