这个功能必须在“红石-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 == -) 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>

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

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

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

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

示例代码下载地址

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

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

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

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

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

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

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

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

    老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...

  5. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

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

    除了 DirectX 游戏开发,我们一般很少单独使用 UI Composition ,因此,与 XAML 互动并集成是必然结果.这样能够把两者的优势混合使用,让UI布局能够更灵活. 说到与 XAML ...

  8. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

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

    在做Win10开发的时候,我们可能经常会需要获得当前程序在在哪个平台设备上运行,用于UI和相关API的调用,那么可以通过什么方式知道当前APP运行的平台呢? 今天这里提供两个方法给大家做参考: 方法一 ...

随机推荐

  1. Fis3的前端工程化之路[三大特性篇之资源定位]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  2. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  3. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  4. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  5. Div Vertical Menu ver5

    这个小功能,如果是算此次,已经是第5次修改了.可以从这里看到前4次:V1, http://www.cnblogs.com/insus/archive/2011/10/17/2215637.html V ...

  6. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. HTML简单入门内容

    常用属性: Width=宽度 Height=高度 Size=大小 Color=颜色 Align=布局方向,值包括(top,bottom,left,right,center)上,下,左,右,中. Bor ...

  8. CSS3 @keyframes 动画

    CSS3的@keyframes,它可以取代许多网页动画图像,Flash动画,和JAVAScripts. CSS3的动画属性 下面的表格列出了 @keyframes 规则和所有动画属性: 浏览器支持 表 ...

  9. 【原】无脑操作:express + MySQL 实现CRUD

    基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...

  10. 【干货分享】流程DEMO-借款申请

    流程名: 借款申请   业务描述: 当员工个人在工作中需要进行借款时,通过此项流程提交借款申请,审批通过后,财务部进行款项支付.   流程相关文件: 流程包.xml WebService业务服务.xm ...