迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动。Windows传统桌面程序的传统陋习。不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用。
  但是上班呢,老板是给钱的,只要有需求,节操什么的不重要。今天我们就来看怎么弄开机自启动……(大雾)
  当然我们这里介绍的,是可以让用户随时禁用的。还有就是MS Store在审核时,会让你写需要自启动的理由。原生的UWP APP还会有一个要求授权的对话框。
  首先我们还是和上一篇一样,建好一个空的WPF(WinForm也行)工程和一个Packaging工程。假设我们这里叫AutoLaunchApp和AutoLaunchPackaging。记得在Packaging工程的Applications下添加对AutoLaunchApp的引用。
  接下来右键Package.appxmanifest文件,选择open with…再选择XML(Text)Editor打开。

  

  在这个XML文件中,在最上方的Package添加命名空间

xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"

  

  之后就可以通过desktop来添加desktop:Extension和desktop:StartupTask节点。这里的属性值介绍见下表:

Category: windows.startupTask
Executable: 转制的exe文件名,我们这里是AutoLaunchApp.exe
EntryPoint: Windows.FullTrustApplication
TaskId: 给StartupTask起个名字,方便在C#代码里关闭和开启Task
Enabled: 默认是否开启自启动
DisplayName: 显示在Windows任务管理器里的名字

  

  最简单的自启动任务到此就完成了。通过Visual Studio部署安装后(不要按F5运行),就可以在任务管理器中找到AutoLaunchApp。此时会发现Status的状态是Disabled。此时的StartupTask实际是没有激活的。在这种情况下重新启动电脑,并不会开机自启动AutoLaunchApp。

  

  此时如果我们运行一次AutoLaunchApp,则会将Status置为Enabled,从而启用开机自启动的功能。
  那有的同学就较真了,我原来的桌面程序,不用运行一次,安装完毕直接重启电脑就可以实现开机自启动。你这个不符合要求。说实话这个问题是挺头疼的,但也不是没有办法解决。
  我这里提供一个很简单的方法,特别适合于不走商店流程(也就是sideload,常见于通过企业IT部署),而是通过独立的msi之类的安装包安装的情况。
  首先我么需要通过Packaging工程的Package.appxmanifest文件,来给AutoLaunchApp增加一个Protocol。这里我们在tab页中选择Declarations,然后在Available Declarations中选择Protocol,点击Add。在Name一栏随便填个缩写alpp(Auto Launch Packaging Protocol)。

  

  完成后重新部署,然后我们就可以通过这个缩写来进行URI启动APP的操作了。如果此时我们在CMD中输入“start alpp:”,回车后会发现AutoLaunchApp被启动。
  接下来我们需要通过安装包的脚本向注册表插入这个cmd的script。
  [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce]

  

  这样的话,我们会有一个一次性的CMD script在Windows启动时被执行。然后通过CMD script来启动AutoLaunchApp,激活StartupTask。
  本篇我们讨论了如何开机自启动转制的desktop APP,下一篇会讨论如何在APP的设置里开启/禁用自启动的选项,谢谢将鼠标滚动到这里的同学。
  GitHub:
  https://github.com/manupstairs/DesktopBridgeSamples.git

迁移桌面程序到MS Store(3)——开机自启动的更多相关文章

  1. 迁移桌面程序到MS Store(5)——.NET Standard

    接下来的几篇,我想讨论下迁移桌面程序到MS Store,可以采用的比较常见.通用性比较强的实施步骤和分层架构. 通常商业项目一般都是不断的迭代,不太可能突然停止更新现有的桌面版本,然后花很长时间从头来 ...

  2. 迁移桌面程序到MS Store(1)——通过Visual Studio创建Packaging工程

    之前跑去做了一年多的iOS开发,被XCode恶心得不行.做人呢,最重要的是开心.所以我就炒了公司鱿鱼,挪了个窝回头去做Windows开发了.        UWP什么的很久没有正儿八经写了,国内的需求 ...

  3. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component

    在上一篇<迁移桌面程序到MS Store(7)——APPX + Service>中,我们提到将desktop application拆分成UI Client+Service两部分.其中UI ...

  4. 迁移桌面程序到MS Store(9)——APPX With Desktop Extension

    在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...

  5. 迁移桌面程序到MS Store(10)——在Windows S Mode运行

    首先简单介绍Windows 10 S Mode,Windows在该模式下,只能跑MS Store里的软件,不能通过其他方式安装.好处是安全有保障,杜绝一切国产流氓软件.就像iOS一样,APP进商店都需 ...

  6. 迁移桌面程序到MS Store(12)——WPF使用UWP InkToolbar和InkCanvas

    我们在<迁移桌面程序到MS Store(4)——桌面程序调用Win10 API>提到了对Win10 API的调用,但仍存在无法在WPF中使用UWP控件的问题,虽然都是XAML控件,但却是两 ...

  7. 迁移桌面程序到MS Store(13)——动态检查Win10 API是否可用

    假设我们现有一个WPF程序,需要支持1903以前的Windows 10版本.同时在1903以后的版本上,额外多出一个Ink的功能.那么我们就可以通过ApiInformation.IsApiContra ...

  8. 迁移桌面程序到MS Store(14)——APPX嵌入WCF Service以Admin权限运行

    Windows10 1809版本开始,微软又对UWP开放了新的Capability:AllowElevation. 通过这个新的Capability,UWP APP能够在运行时向用户请求Admin权限 ...

  9. 迁移桌面程序到MS Store(2)——Desktop App Converter

    迁移传统桌面程序到MS Store的另一种方式是使用Desktop App Converter工具.虽然本篇标题包含了Desktop App Converter(以下简称DAC),实际上我是来劝你别用 ...

随机推荐

  1. mybatis3.2初学感悟

    新手,学了mybatis框架一周,写点感悟下来. mybatis,是操作数据库,持久层的一个框架,它是对JDBC的封装.看到了这个框架,我突然感受到封装与抽象的力量.也明白了些为什么要分层的原因. 记 ...

  2. python学习 day1 (3月1日)

    01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. 飞机 内存:临时存储数据. 8g,16g, 高铁 1,成本高. 2,断电即消失. 硬盘:长期存储大量的数据. 1T 512G等等 ...

  3. oracle 查看表空间使用情况

    查看表空间剩余: ||'M' from dba_free_space group by tablespace_name 查看表空间总大小.使用大小.剩余大小,使用率.剩余率 ) useded, tru ...

  4. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  5. 2019.01.02 洛谷P4512 【模板】多项式除法

    传送门 解析 代码: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long l ...

  6. 2018.11.05 bzoj2143: 飞飞侠(最短路)

    传送门 最短路好题. 考虑对每个二维坐标建立一个高度属性. 这样每次如果在点(i,j,0)(i,j,0)(i,j,0)只能选择花费bi,jb_{i,j}bi,j​跳向(i,j,ai,j)(i,j,a_ ...

  7. Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题

    实体类中日期定义的是Date类型的,没毛病: 我在mybatis里面定义的是Date类型的,进行测试的时候发现,数据库插入的日期的时分秒全部都是一样的,都是12:00:00,很郁闷: 后来把mybat ...

  8. PHP发起POST DELETE GET POST 请求

    原文链接:http://blog.csdn.net/lengxue789/article/details/8254667 关于POST,DELETE,GET,POST请求 get:是用来取得数据.其要 ...

  9. 线程之threading

    多任务:操作系统同时运行多个任务 线程:一个程序运行起来之后一定有一个执行代码的东西,该东西即为线程 线程是操作系统调度执行的最小单位   * 并发:指的是任务数多余cpu核数,通过操作系统的各种任务 ...

  10. FatMouse's Speed (hdu 1160)

          #include <iostream> #include <cstdio> #include <cstring> #include <algori ...