這是昨天一個學生問我的問題『怎麼從 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 的最後結果