这是昨天一个学生问我的问题‘怎么从 Windows Store App 启动 Desktop Application?’,这是个好问题而且引起了我的兴趣,老实说,压根儿从来没想过这种情境,但这问题真的太有趣了,答案是:‘的确有办法从 Windows 市集应用程序启动桌面应用程序,重点是一点也不难’,接下来就来看看是怎么达成这样的需求。
这是昨天一个学生问我的问题‘怎么从 Windows Store App 启动 Desktop Application?’,这是个好问题而且引起了我的兴趣,老实说,压根儿从来没想过这种情境,但这问题真的太有趣了,答案是:‘的确有办法从 Windows 市集应用程序启动桌面应用程序,重点是一点也不难’,接下来就来看看是怎么达成这样的需求。
一开始我想聊聊思考这问题的路子,第一个想法是:‘ 一个 Windows 市集应用程序如何启动另外一个 Windows 市集应程序?’,这个答案很明显,通常是透过 URI 或 File Association 来达成。既然如此,Windows 市集应用程序应该也可以透过这种方式来启动桌面应用程序才对。然后我就做了一个实验,我在 Metro IE 上打上 mms:// 的通讯协定测试是否能够启动Windows Media Player,结果是正确启动的;至此,答案已经很明显了,既然 Windows Media Player 这个桌面的应用程序可以这样被启动,其它的应用程序也应该可以这么做,于是我就开始动手测试与验证自己的想法是否正确。
整个的测试过程是这样完成的:
(1) 先做一个 Windows Forms Application 当做要被调用的对象,这个程序画面只有一个 Lable,但为了要让启动时可以传参数,稍微修改了一些东西。
Program.cs
- static class Program
- {
- [STAThread]
- static void Main(string[] args)
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1(args));
- }
- }
Form1.cs
- public partial class Form1 : Form
- {
- public Form1()
- {
- }
- public Form1(string[] args)
- {
- InitializeComponent();
- var data = args[0].Split(':');
- if (data.Length > 1)
- {
- label1.Text = data[1];
- }
- else
- {
- label1.Text = "no args";
- }
- }
- }
(2) 接着我在电脑的注册表中新增自订的 URI Protocol, 命名为 callbill,参考 Registering an Application to a URI Scheme
(3) 最后新增一个 Windows 市集应用程序项目,在 UI 上放一个 Button ,为 Button.Click 事件撰写委派函数如下
- async private void Button_Click(object sender, RoutedEventArgs e)
- {
- string uriToLaunch = "callbill:Hello_Uri_Launcher";
- var result = await Windows.System.Launcher.LaunchUriAsync(new Uri(uriToLaunch ));
- }
执行 Windows 市集应用程序,按下 Button 的最后结果
如同我一开头所讲的就是这么简单,几个轻松的步骤就可以完成‘听起来似乎很困难’的事情。
原文:大专栏 如何从 Windows 市集应用程序启动桌面应用程序