UWP: 实现 UWP 应用自启动

原文:UWP: 实现 UWP 应用自启动

在上一篇文章中,我们实现了使用命令行来启动 UWP 应用,在这一篇文章中,我们会实现 UWP 应用自启用的实现,也即开机后或用户登陆后,应用自己启动。这些特性原来都是 Win32 程序所具备的,UWP 能够支持这些特性使得它和 Win32 程序的行为进一步相同。 

实现

与实现命令行启动一样,实现自启动也大体上分为两步:首先,在 Package.appxmanifest 中添加 windows.startupTask 扩展(Extension);然后,在 App 类中处理 OnActivated 事件。事实上,除了这两步外,我们还需要增加检查 StartupTask 的状态并允许用户控制自启动的逻辑。

1. 修改 Package.appxmanifest 

右击项目中的 Package.appxmanifest 文件,在快捷菜单中选择“打开方式“->”XML 文本编辑器“。打开后,对它的内容按以下修改:

<Packagexmlns="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" /><Buttonx: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 的枚举属性,用于表示其状态。它们的值及其意义,在注释中已经说明。

补充说明以下几点:

  1. 最开始时,任务的 State 是 Disabled;
  2. 唯有当其 State 是 Disabled 时,才能以编程的方式使用启动;
  3. 当其 State 是 DisabledByUser 或 DisabledByPolicy,需要经由用户手工启动;
  4. 不支持以编程的方式使其 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.mzph.cn/news/284156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

选择 GCD 还是 NSTimer ?

我们常常会延迟某件任务的执行&#xff0c;或者让某件任务周期性的执行。然后也会在某些时候需要取消掉之前延迟执行的任务。 延迟操作的方案一般有三种&#xff1a; 1.NSObject的方法&#xff1a; 2.使用NSTimer的方法&#xff1a; 3.使用GCD的方法&#xff1a; 一般情况下&am…

Web框架 性能评测 -- C# 的性能 和 Rust、C++并驾齐驱

自从2021年2月第20轮公布的测试以后&#xff0c;一年半后 的2022年7月19日 发布了 TechEmpower 21轮测试报告&#xff1a;Round 21 results - TechEmpower Framework Benchmarks。Techempower benchmark是包含范围最广泛的web框架性能测试&#xff0c;覆盖了比较典型的使用场景…

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

文章目录 一、路径剖面简介二、创建剖面图1. 加载DEM2. 创建剖面图3. 计算填挖方3. 保存剖面图一、路径剖面简介 路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。 要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击…

QT中VideoProbe的简介和实现

一、遇到问题在Android机上使用QT进行图像处理程序设计的时候&#xff0c;遇到的一个比较明显的问题就是图片采集的问题----摄像头获得是实时的视频&#xff0c;如果我们想从中动态地截获图片&#xff0c;并且转换成Mat的格式&#xff0c;那么仅仅是静态的imagecapturee就无法完…

WinForm(二):WinFrom中Main函数的入参和出参

基本上有独立进程的应用&#xff0c;都是以Main函数作为入口&#xff0c;开始运行的。在C#中&#xff0c;Main函数可以无参无返回值&#xff0c;当然也可以是有string[]参数和int返返回值的。WinFrom也满足这个规则。那么Main作为一个进程的开始函数&#xff0c;那么是谁传这些…

编译源码 JAVA out of memory

转载于:https://www.cnblogs.com/dyufei/p/6612032.html

【GlobalMapper精品教程】029:栅格重分类案例详解

重分类就是对原有栅格像元值重新分类从而得到一组新值并输出。重分类工具有多种方法将像元值重新分类或更改为替代值,Globalmapper提供了栅格重分类的功能。 文章目录 一、栅格重分类简介二、栅格重分类案例【参考阅读】:ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Re…

Mybatis 和 JPA 用哪个好? 优缺点 ?

本文不会下关于 Mybatis 和 JPA 两个持久层框架哪个更好这样的结论。只是摆事实&#xff0c;讲道理&#xff0c;所以&#xff0c;请各位看官勿喷。 一、事件起因 关于 Mybatis 和 JPA 孰优孰劣的问题&#xff0c;争论已经很多年了。一直也没有结论&#xff0c;毕竟每个人的喜…

SkiaSharp 之 WPF 自绘 五环弹动球(案例版)

此案例基于拖曳和弹动球两个技术功能实现&#xff0c;如有不懂的可以参考之前的相关文章&#xff0c;属于递进式教程。五环弹动球好吧&#xff0c;名字是我起的&#xff0c;其实&#xff0c;你可以任意个球进行联动弹动&#xff0c;效果还是很不错的&#xff0c;有很多前端都是…

【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用)

本文讲述globalmapper软件在无人机航测了内业处理中的应用之:浏览地理照片及航线信息、相机参数、元数据编辑器。 文章目录 1. 航线信息浏览2. 地理图像浏览2.1 数字化工具2.2 要素信息工具2.3 属性表3. 照片原数据编辑1. 航线信息浏览 打开globalmapper软件,加载无人机航测…

【GlobalMapper精品教程】031:Globalmapper在航测内业数据处理中的应用举例

Globalmapper在航测内业数据处理中的应用举例索引。 文章目录 1. 图像及航线浏览2. 3D重建3. 点云分类4. 创建地形5. 地形分析1. 图像及航线浏览 扩展阅读:【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用) 2. 3D重建 从Global Mapper的19版本开始,Pixels-…

移动工具V和选区工具M

移动工具快捷键&#xff1a;V 属性&#xff1a; 自动选择 在默认情况下&#xff0c;移动工具的“自动选择”一项是没有勾选的。表示只能选中图层窗口中选定的固定图层&#xff0c;不能随意的点击选择别的图层。在这里&#xff0c;我们也勾选“自动选择”&#xff0c;可任意选择…

SeleniumWebDriver扩展插件开发

Selenium WebDriver 是一组开源 API&#xff0c;用于自动测试 Web 应用程序&#xff0c;利用它可以通过代码来控制chrome edge等浏览器&#xff01;有时候我们需要mock接口的返回&#xff0c;或者拦截和转发请求&#xff0c;今天就来实现这个功能本插件代码已开源&#xff1a;h…

[转]钱岭:别担心“35岁危机”,要成为“老专家”

从清华大学到贝尔实验室&#xff0c;再到中国移动&#xff0c;作为“IT老人”&#xff0c;钱岭的技术人生几乎覆盖了20世纪90年代至今的信息产业革命。2007年开始&#xff0c;钱岭在中国移动经历了基础科研到产品落地&#xff0c;再到团队孵化&#xff1b;也经历了云计算从无到…

【GIS前沿】周成虎院士:GIS的大数据时代展望(PPT分享)

本文源自微信公众号&#xff1a;宋关福GIS笔记。版权归原作者及刊载媒体所有&#xff0c;如有侵权请立即与我们联系,我们将及时处理。更多GIS前言技术&#xff0c;请关注《GIS前言》专栏。 GIS的大数据时代展望

DataV:可视化大屏展示神器实战分享

由于公司年即将发布新的产品&#xff0c;传统意义上的PPT显得不太生动化&#xff0c;所以想采用具体化&#xff0c;可视化的数据大屏进行业务数据的事实展示&#xff0c;第一时间想到了来自于阿里云旗下的DataV&#xff0c;废话不多说&#xff0c;老司机开始发牌照&#xff01;…

数据库性能系列之索引(中)

GOOD NIGHT前言上一篇中&#xff0c;我们已经了解到了索引的基本概念和一些用法。那索引为什么会提升查询的速度&#xff0c;以及索引究竟是怎么工作的呢&#xff1f;也许大家心里还是有一些迷茫&#xff0c;这一切&#xff0c;还要从索引背后的算法说起。GOOD NIGHT概述大家知…

微服务架构的设计原则和核心话题

目录 一、前言 二、微服务架构的设计原则 1.拆分足够微 2.轻量级通信 3.单一职责原则 4.领域驱动原则 三、微服务架构的核心话题 1.服务拆分 2.服务注册与发现 3.负载均衡 4.API网关 5.服务部署与发布 四、总结 一、前言 毫无疑问&#xff0c;微服务架构的设计原…

Golang GOPATH 包

2019独角兽企业重金招聘Python工程师标准>>> Golang GOPATH & 包的定义 & 包的导入 GOPATH 设置 go 命令依赖一个重要的环境变量&#xff1a;$GOPATH 可以在 .zshrc 配置文件中加上一行这样的配置&#xff0c; export GOPATH/Users/flyme/mygo Go从1.1版本到…