这个功能必须在“红石-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. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. 展望未来:使用 PostCSS 和 cssnext 书写 CSS

    原文链接:A look into writing future CSS with PostCSS and cssnext 译者:nzbin 像twitter,google,bbc使用的一样,我打算看一 ...

  3. 【云知道】LoadRunner 录制问题集锦

    关键词:各路录制小白汇集于此 虽然知道君对录制不感冒,但总是看到扎堆的人说这些问题,忍不住要站出来了. 百度虽好,帮助了很多小白,但关键是百度并没有排除错误内容,经过历史的几年传播,错的都快变对的了, ...

  4. nexus 社区版3.0.2部署、访问

    下载nexus社区办(oss): https://www.sonatype.com/download-oss-sonatype 目前最新版本  nexus-3.0.2-02-win64.zip nex ...

  5. iOS7 NavigationController 手势问题

    在iOS7中,如果使用了UINavigationController,那么系统自带的附加了一个从屏幕左边缘开始滑动可以实现pop的手势.但是,如果自定义了navigationItem的leftBarB ...

  6. struts2国际化

    struts2国际化 1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素 ...

  7. a标签绝对定位,点击区域被图片遮挡(IE下)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. D3.js学习(七)

    上一节中我们学会了如何旋转x轴标签以及自定义标签内容,在这一节中,我们将接触动画(transition) 首先,我们要在页面上添加一个按钮,当我们点击这个按钮时,调用我们的动画.所以,我们还需要在原来 ...

  9. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  10. ABP理论之CSRF

    返回总目录 本篇目录 介绍 ASP.NET MVC ASP.NET WEB API ASP.NET Core[以后补上] 客户端类库 内部原理 介绍 CSRF[Cross-Site Request F ...