上一篇我们讨论了如何在转制的桌面程序中,通过StartupTask来实现转制版本的开机自启动。
实际操作中,我们通过编辑Packaging工程中的Package.appxmanifest文件,来添加自启动的配置项。如果要在程序的UI中实现开启和关闭自启动的功能。那就需要通过代码来操作StartupTask对象。
StarupTask位于Windows.wimd(Windows元数据文件)中的命名空间Windows.ApplicationModel。
在桌面程序中调用Win10 API一般有以下两个途径。
第一种是通过Nuget来安装一个叫做UwpDesktop的库,优点是比较简单,维护起来也方便。
缺点在我看来比较严重,这个库很久没有更新了,Win10 kits的版本仍停留在14393。要知道即使是推荐给商业客户用的版本也已经是15063了。
第二种是手动添加引用,这个听上去麻烦,但只要做过一次就会觉得还是自己动手靠谱。
右键选择给工程Add References,打开文件夹
C:Program Files (x86)Windows Kits10UnionMetadata
可以看到上图存在16299,17134和17763三个版本,我这里选择了当前比较普及的17134版本。
仅仅添加这一项是不够的,另一个必选项是
C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETCorev4.5System.Runtime.WindowsRuntime.dll
完成添加引用的操作后,就可以在AutoLaunchApp工程中使用StartupTask类了。
var startupTask = await StartupTask.GetAsync("AutoLaunchAppTask"); State = startupTask.State; if (IsChecked) { switch (State) { case StartupTaskState.Disabled: // Task is disabled but can be enabled. State = await startupTask.RequestEnableAsync(); // ensure that you are on a UI thread when you call RequestEnableAsync() break; case StartupTaskState.DisabledByUser: // Task is disabled and user must enable it manually. MessageDialog dialog = new MessageDialog( "You have disabled this app's ability to run " + "as soon as you sign in, but if you change your mind, " + "you can enable this in the Startup tab in Task Manager.", "TestStartup"); await dialog.ShowAsync(); break; case StartupTaskState.DisabledByPolicy: Debug.WriteLine("Startup disabled by group policy, or not supported on this device"); break; } }
逻辑比较简单,基本就是先获取StartupTask对象,再根据用户操作来Enable或Disable,之后返回更新后的StartupTaskState。
如果选择了14393的SDK版本,就会遗憾地收到一条Warring,虽然也不影响实际效果,但还是感觉怕怕的。
好了,从桌面程序调用Win10 API就是这么简单,各位大哥能用新的API就尽量别去"Minimun supported client Windows XP"的页面抄代码了,混搭这种年龄差距太大的API,会有代沟的T_T
本篇代码依然放在全球最大同性交友平台GitHub上:
https://github.com/manupstairs/DesktopBridgeSamples.git
话说Github这货现在姓微软了……而且他们三哥老大也真是会玩,把Edge也给换心了,根不正苗不红的。罢了罢了他开心就好。消息又是JB哥来宣布的,这位老兄真是去哪哪塌崩,和内森·德雷克一个属性。