【Win 10 应用开发】启动远程设备上的应用

这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用。激活远程应用需要以下前提:

  • 系统必须是build 14393或以上版本,UWP应用必须使用14393或以上版本的SDK开发。
  • 被启动的应用应当支持协议激活,比如Cortana的协议URI为:【ms-cortana:】,当然如果是你自己开发的应用,可以自己定义一个协议,名字随便取,不要跟系统的协议或别人的应用冲突就行,比如:【haha:】【zxzx:】等。
  • 必须用同一个Microsoft帐号登录的设备。即同一个MS帐号登录的设备才可以。这个功能得保证一定的安全性,肯定不能让你随便什么设备都能连,那应用就成了木马了。

设置种类没有限制,只要运行“红石”或以上的Windows 10系统就行,包括PC、平板、Hub、手机、xBox、笔记本、Iot、全息虚拟化设备……如果是虚拟机里面装的系统,用MS帐号登录就可以了,只要是Win 10,管你什么设备,都可以耍。

是不是很高大上,下面老周就说说怎么耍,老规矩,还是先来了解一下方法。

我们要用到两个命名空间,你要用的类,就从这两个命名空间里面找就行了,一定要学会用“对象浏览器”窗口。

  • Windows.System
  • Windows.System.RemoteSystems

看看名字,Remote System,你都可以猜到七分,肯定和远程调用有关的。

要调用远程设备上的应用,首先得找出这些设备,SDK提供了两种方法来实现。第一种方法比较简单,直接通过设备名来找,调用RemoteSystem.FindByHostNameAsync(HostName)静态方法,指定要查找的设备名,如果找到,就返回一个RemoteSystem实例(可异步等待)。RemoteSystem类封装了远程系统相关的信息,信息量不大,无非就是计算机名,以及一个ID值,这个ID可以用于唯一标识设备。

第二种方法工程量有点大,它是通过创建一个RemoteSystemWatcher对象,然后用这个对象来监视远程设备的连接情况,如果找到设备,会发生RemoteSystemAdded事件,如果某个设备被移除(MS帐号不再登录该设备,并在设备管理网页中移除设备)就会引发RemoteSystemRemoved事件。

要开启监视就调用Start方法,要停止就调用Stop方法。

在创建RemoteSystemWatcher对象时,可以向RemoteSystem.CreateWatcher方法传递若干个过滤器,以确定查找范围。过滤器类都会实现IRemoteSystemFilter接口。

可选的过滤器可以有这些:

  • RemoteSystemKindFilter:按设备类型来过滤,如桌面、手机、xBox等,这个字符串可以从RemoteSystemKinds类的静态属性中获取。
  • RemoteSystemDiscoveryTypeFilter:按发现范围来过滤,规则由RemoteSystemDiscoveryType枚举来定义,Any表示不限制范围,Proximal表示通过内网或蓝牙可以连接的范围来找,Cloud是云端记录的设备,就是用MS帐号登录的设备。当然大提前是这些设备都用MS帐号登录并使用中。
  • RemoteSystemStatusTypeFilter:通过设备的当前状态来过滤,即这个设备当前是否处于可连接状态。

查找到远程设备后,使用RemoteSystem实例创建一个RemoteSystemConnectionRequest实例,因为激活应用的时候要用到。

最后把刚创建的RemoteSystemConnectionRequest实例,连同要启动应用的URI一起传递给RemoteLauncher类的LaunchUriAsync方法就可以启动远程设备上的应用了。

下面,实战一下。

这个示例不复杂,先扫描可用的远程设备(电脑、手机、平板、游戏机通杀),然后选择一个设备,最终启动目标设备上的【计算器】应用。UWP计算器的协议URI为:【calculator:】(不包括【】)。

首先,查找一下设备。

           var reqres = await RemoteSystem.RequestAccessAsync();
            if (reqres != RemoteSystemAccessStatus.Allowed)
            {
                btnLaunch.IsEnabled = false;
                return;
            }

            List<IRemoteSystemFilter> filterList = new List<IRemoteSystemFilter>();
            RemoteSystemDiscoveryTypeFilter ft1 = new RemoteSystemDiscoveryTypeFilter(RemoteSystemDiscoveryType.Any);
            string[] kinds =
            {
                RemoteSystemKinds.Desktop,
                RemoteSystemKinds.Phone,
                RemoteSystemKinds.Xbox
            };
            RemoteSystemKindFilter ft2 = new RemoteSystemKindFilter(kinds);
            filterList.Add(ft1);
            filterList.Add(ft2);

            watcher = RemoteSystem.CreateWatcher(filterList);
            watcher.RemoteSystemAdded += RemoteSystem_Added;
            watcher.RemoteSystemRemoved += RemoteSystem_Removed;
            watcher.Start();

注意,在做任何查找操作之前,必须先调用RequestAccessAsync方法,确定系统允许你操作才行,否则是白忙一场。

下面代码处理watcher的两个事件。

        private async void RemoteSystem_Removed(RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
             {
                 RemoteSystem sys = remoteSystems.FirstOrDefault(r => r.Id == args.RemoteSystemId);
                 if (sys != null)
                 {
                     remoteSystems.Remove(sys);
                 }
             });
        }

        private async void RemoteSystem_Added(RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                remoteSystems.Add(args.RemoteSystem);
            });
        }

现在,可以在选定的设备上启动计算器了。

           if (lv.SelectedIndex == -1) return;

            btnLaunch.IsEnabled = false;
            RemoteSystem rmsys = lv.SelectedItem as RemoteSystem;
            Uri remoteUri = new Uri("calculator:");
            RemoteSystemConnectionRequest request = new RemoteSystemConnectionRequest(rmsys);
            var r = await RemoteLauncher.LaunchUriAsync(request, remoteUri);
            btnLaunch.IsEnabled = true;

还有很关键一步,就是配置清单文件,如果不配置,是没有权限的。

支持远程系统的设备功能是在版本3的XML命名空间中声明的,所以要先引入。

xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"

给它一个前缀叫uap3,后面方便引用。然后声明相关的Capability。

<Capabilities>
    <Capability Name="internetClient" />
    <uap3:Capability Name="remoteSystem" />
  </Capabilities>

好了,一切都准备好了,先启动另一台设备(或者虚拟机中的系统)。

然后回到开发机,运行应用,它会查找到你登录过的设备。

在列表中选择一台设备,再点下面的按钮,如果没有发生自然灾害的话,你的另一台设备上的【计算器】应用就会启动。如下图。

好了,今天的话题就讨论到这里吧。

示例代码下载地址

时间: 2024-10-11 03:50:57

【Win 10 应用开发】启动远程设备上的应用的相关文章

【Win 10应用开发】如何知道当前APP在哪个平台设备上运行

[Win 10应用开发]如何知道当前APP在哪个平台设备上运行 在做Win10开发的时候,我们可能经常会需要获得当前程序在在哪个平台设备上运行,用于UI和相关API的调用,那么可以通过什么方式知道当前APP运行的平台呢? 今天这里提供两个方法给大家做参考: 方法一:DeviceFamily 通过Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily,来获取当前的平台设备,目前只可以得到两个值Windows.Mobile或Wind

【Win 10应用开发】如何知道UAP在哪个平台上运行

原文:[Win 10应用开发]如何知道UAP在哪个平台上运行 面向22世纪的现代化应用程序可以同时在多种设备上运行,于是有朋友会有一个疑问:有时候,我们还真的需要判断一下,UAP应用程序在哪个平台上运行.尽管大多情况下我们不必要这样做,但某些特殊情况还得考虑.比如一串数据列表,我希望如果在桌面上运行时就以横向列表展现:但要是运行在手机上就以纵向列表展现. 也就是说,其实我们只需分析两种情况即可: 一.桌面.(台式机.笔记本.平板.游戏机.发广告专用机.导航器……) 二.移动环境.其实就是手机.

【Win 10 应用开发】Toast通知激活应用——前台&amp;后台

原文:[Win 10 应用开发]Toast通知激活应用--前台&后台 老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话,说不定能遇到红颜知己,但这概率相当低.从长远发展看嘛,是没什么用.老周当年读了四年本科,在学生会混了四年,什么名堂也没混出来. 一方面老周向来不求虚名,所以也没去参选所谓的什么部长.主席之类的,这些“官衔”听起来很高大上,实际上很

【Win 10 应用开发】打印UI元素

原文:[Win 10 应用开发]打印UI元素 Windows App支持将UI界面进行打印的功能,这与浏览器中的打印网页的用途相近,其好处就是“所见即所得”,直接把界面上呈现的内容打印下来,比重新创建打印图像方便得多. 要在通用App中实现打印,主要依靠以下几个类型: PrintManager:位于Windows.Graphics.Printing命名空间,主要负责显示打印对话框,设置打印源等操作.在使用时,首先调用GetForCurrentView静态方法得到一个PrintManager实例:

【Win 10应用开发】实现全屏播放的方法

原文:[Win 10应用开发]实现全屏播放的方法 有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整个窗口,就等于全屏播放了,但是,Win10应用是窗口化的,将MediaElement控件的IsFullWindow属性设置为true后,就会这样: 从上面的截图看,MediaElement控件只是覆盖整个窗口而已,并没有实现全屏.那有办法让它全屏播放

【Win 10 应用开发】RTM版的UAP项目解剖

原文:[Win 10 应用开发]RTM版的UAP项目解剖 Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家不要问老周有什么新的API. API虽然没变,但VS中的应用程序项目是有了新变化.毕竟以前都是预览的,而现在是“正规军”,以前练兵时都用土豆枪,现在都是真刀真枪干了,故而应用程序项目是有变化的. 以前老周跟大家讲的修改项目模板,去掉遥测类库的

【Win 10 应用开发】导入.pfx证书

这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecert工具.好,我们先用这个工具来生成一个证书,并存放到当前用户的证书存储中.打开VS的开发人员命令提示符,然后输入: makecert -n "CN=中国好男人" -pe -sr CurrentUser -ss My -b 01/01/2016 -e 12/31/2018 -n 表示证书的标

【Win 10应用开发】Adaptive磁贴模板的XML文档结构

在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win 10的API中也是支持的,此外,Win10 App还支持全新的自适应磁贴模板,本文老周就给大家先讲一下基本结构,下一篇文章中咱们再说一说复杂排版. 应用程序的图标可以分为两类:第一类是应用商店上专用的,就是你的应用提交到商店后,给用户看的图标:另一类就是应用本身的一些图标或磁贴. 磁贴其实也就这么

【Win 10 应用开发】UI Composition 札记(三):与 XAML 集成

除了 DirectX 游戏开发,我们一般很少单独使用 UI Composition ,因此,与 XAML 互动并集成是必然结果.这样能够把两者的优势混合使用,让UI布局能够更灵活. 说到与 XAML 的集成,则我们必须先认识一位伙计,他非常重要,位于 Windows.UI.Xaml.Hosting 命名空间下,名叫 ElementCompositionPreview ,有了它,我们才可以在 XAML 元素与 Composition UI 元素之间游走.来看看它都公开了哪些成员. public s