存档

文章标签 ‘metro’

桌面程序调用metro/modern应用

2014年3月17日 没有评论

在我的上一篇文章《自定义协议及其在metro中的应用》中,描述了如何在metro应用程序中调用桌面程序。当然,现在微软为了避免版权的问题,已经把metro改名为modern了。今天,项目的需求恰好和这个相反,是由桌面应用程序来调用metro应用。

在以前的文章中,我提到了自定义协议,这次我也寻思着是不是可以一样通过自定义协议来解决。网上狂搜索了一把,还是google给力,在msdn上找到了解决方法,这里给记录下来,方便国内的用户。

首先,我们打开项目,找到Package.appxmanifest文件,然后切换到“声明”选项卡,添加一个协议,同时设置一个名称,例如sgy,其它的信息都是可选的,看着输入好了。

接下来,我们找到App.xaml的代码文件,找到 OnActivated方法,在这个方法里添加代码即可。

protected override void OnActivated(IActivatedEventArgs args){
if(args.Kind == ActivationKind.Protocol){
ProtocolActivatedEventArgs eventArgs = args as ProtocolActivatedEventArgs;
//eventArgs.Uri.AbsoluteUri 就是我们要的数据了,剩下的就是字符串参数操作了
}
}

到这里就差不多完成啦,是不是很简单~

接下来就是程序调用部分了,比如说我们想调用程序并传递一个 wifilist 参数,可以这么来调用:sgy://wifilist,就和打开一个网页是一样样的。操作系统会在安装app的时候帮我们建立sgy协议和metro程序的关联,不需要我们操心在注册表里设置关联了。略有遗憾的是参数只能是字符串形式,如果参数是对象的话,就需要实例化转换成字符串了。

分类: 日常 标签: , ,

app连接到windows store

2013年4月16日 没有评论

在我们的 metro/modern 应用中,如果我们的程序想实现直接跳转到微软的windows store中的话,可以参考下面的方法,这些也是我在翻 MSDN 的文档中看到的。

使用协议,关于自定义协议的文章,可以看衣服自己洗的文章。

通过ms-windows-store协议来实现。目前该协议支持3种行为,分别为 PDP、Updates、Search。首先我们要知道应用程序的包名,把应用程序的包名作为参数传递过去就可以了。如果是应用程序本身的话,可以通过 Package.Current.Id.FamilyName 来获得。

完整的程序代码:

await Launcher.LaunchUriAsync(new Uri(“ms-windows-store:PDP?PFN=” + Package.Current.Id.FamilyName));

PDP 是打开应用的列表页,参数 PFN 为应用程序的包名。Updates 是打开 store 的更新页。Search 是打开store 的搜索结果列表页,参数 query 是搜索关键词。

分类: 一句话 标签: , ,

自定义协议及其在metro中的应用

2013年4月7日 没有评论

最近工作中有遇到这样的一个需求,就是在metro应用中,想调用指定的windows桌面程序来做一些事情。于是就琢磨了下,使用自定义协议来实现的。

其实我们接触自定义协议,用的最多的就是腾讯的 tencent:// 了,可以实现在网页中调用QQ的添加好友界面了。我们常见的协议有 http  ftp svn  等。当由于实际业务中这样或者那样的实际需要时,我们可以使用自定义协议来满足我们的要求。

为系统添加自定义协议很简单,最简洁的是2步。首先,我们在注册表 HKEY_Classes_Root 下添加协议的名称做为项,例如 zyx,为该项添加一个字符串“URL Protocol”,值为空字符串。接下来,我们再为该协议设置关联程序,在 HKEY_Classes_Root\zyx 下创建项 shell ,在 shell 下创建项 open ,在open 下创建项 command ,为该项设置默认值为应用程序的绝对路径,如果再路径的后面再添加 “%1” 的话,就表示可以接受额外的参数。

这里我给出 .reg 文件好了,很方便开发时使用。

Windows Registry Editor Version 5.00

;添加自定义协议
[HKEY_CLASSES_ROOT\zyx]
“URL Protocol”=””

;设置关联程序
[HKEY_CLASSES_ROOT\zyx\shell\open\command]
@=”c:\\launch.exe %1″

把上面的代码直接保存为reg文件,双击导入到注册表即可。这里有几个小知识点可以说下,reg文件里的注释是以;开头的,如果是多行注释,那么每一行都需要添加分号。如果路径不存在,那么系统会自动创建路径。设置关联程序时,默认值的内容文本里如果包含斜杠的话,那么应该使用双斜杠,和注册表路径区分出来。如果是反注册的话,只用在 HKEY 字符的前面添加一个-,同时去掉设置即可。

在一开始的时候,为注册表添加协议关联,我还犹豫是选择 bat 格式呢还是选择 inf 格式,后来还是决定用 reg 格式了。容易理解,很方便。

 

我们的项目中,想在metro下启动windows应用程序,下面来讲述如何使用。

比如说代码中直接这样执行,bool flag=await Windows.System.Launcer.LaunchUriAsync(new Uri(“zyx://ooxx-with-you”)); 在运行的时候,就会运行我们在注册表里设置的关联程序 launch.exe ,同时把 zyx://ooxx-with-you 作为参数传递过去。

有了参数传入,那么程序就可以做各种逻辑操作了。对于参数,我衣服自己洗这里就多啰嗦2句,虽然对于协议来说,zyx 是协议的名称,但是为了和其它协议作为格式上的一致,我们还是要添加上 :// 标志,作为区分也是好的嘛。另外,在参数中需要考虑2个问题,第一个是符号的问题,如果是特殊符号例如空格什么的,需要考虑编码问题。如果是网页中的地址,IE 会自动帮我们转码,但是其它的部分程序又不会例如资源管理器。所以为了避免编码问题带来的潜在风险,就不要使用特殊符号了。第二个问题是,自定义协议是在注册表里设置的,谁都可以调用,为了安全考虑,关联程序需要对接收到的参数进行检查。当然咯,检查的方法是需要自己来实现的。

有的同学还不是很了解应用场景,这里说一个。metro 应用程序是运行在沙盒中的,metro IE 同样也是的,在有网银、ActiveX的页面中,可能会有些问题,虽然未来可能会有解决方案,但是目前的一个思路就是,系统跳回桌面,使用 desktop 下的 IE 来打开,这么一来,使用自定义协议不就可以解决我们的问题了么。

其实,还有扩展名的解决方案,在我的demo中也实现了,和自定义协议大同小异,就留给大家去思考啦。

 

分类: 日常 标签: ,