在我们的 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 是搜索关键词。
最近在一个android 项目中,想对一个字符串变量做 switch 判断,居然提示说有语法错误,感觉太不可思议了。然后按照 Eclipse 的智能提示,自动做修复。但是在对话框中给出了错误信息,Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7’ instead. Please use Android Tools > Fix Project Properties.
在网上搜索了一把,很多文章都写的是在项目上右键 ->android tools->Fix Project。如果不可以,检查Project->Properties->Java Compiler ,确认是 1.6 。
按照这个操作了后,无论修改成 1.6 还是 1.7还是不可以,很是气愤呀。后来无意见看到到了一个,说是需要确保android sdk中有Android1.6(API4)。果断去下载了,然后把 java compiler 改成 1.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中也实现了,和自定义协议大同小异,就留给大家去思考啦。