博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UWP: 实现 UWP 应用自启动
阅读量:6264 次
发布时间:2019-06-22

本文共 4445 字,大约阅读时间需要 14 分钟。

原文:

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

实现

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

1. 修改 Package.appxmanifest 

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

...

上述加粗的部分就是添加的扩展 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 中增加以下代码:

在 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;    }    var protoclForResultsArgs = (ProtocolActivatedEventArgs)args;    rootFrame.Navigate(typeof(MainPage), protoclForResultsArgs);    Window.Current.Activate();          }

 

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();        }

最后,要注意的是:如果启用了自启动,当系统启动后,应用会以最小化的方式启动。 

参考资料:

转载地址:http://pjdpa.baihongyu.com/

你可能感兴趣的文章
我的家庭私有云计划-20
查看>>
手把手教你封装属于自己的Windows7安装镜像
查看>>
《作业指导书》的发布管理问题与解决办法
查看>>
55.Azure内容分发网络(CDN)
查看>>
MySQL常见错误代码(error code)及代码说明
查看>>
微软MVP社区巡讲
查看>>
总结一下,MariaDB 10(MySQL5.6企业版分支)的主要新特性
查看>>
MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-3-安装-Tool
查看>>
IDS与IPS的区别
查看>>
初试Windows 8 RTM
查看>>
Linux 下rpm包搭建LAMP环境
查看>>
Windows Server 2016-Nano Server介绍
查看>>
未来架构师的平台战略范例(4)_大数据
查看>>
Grizzly学习笔记(二)
查看>>
思科路由器动态VTI IPSec***配置
查看>>
***S启动时遇到1053错误
查看>>
CentOS7.5 使用 kubeadm 安装配置 Kubernetes1.12(四)
查看>>
shell脚本实现对系统的自动分区
查看>>
Tokyo Tyrant基本规范(5)--教程
查看>>
理解图形化执行计划 -- 第3部分:分析执行计划
查看>>