迁移桌面程序到MS Store(4)——桌面程序调用Win10 API

上一篇我们讨论了如何在转制的桌面程序中,通过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 Kits\10\UnionMetadata

可以看到上图存在16299,17134和17763三个版本,我这里选择了当前比较普及的17134版本。

仅仅添加这一项是不够的,另一个必选项是
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.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哥来宣布的,这位老兄真是去哪哪塌崩,和内森·德雷克一个属性。

posted @ 2018-12-20 17:03 楼上那个蜀黍 阅读(...) 评论(...) 编辑 收藏