如何從 Windows 市集應用程式啟動桌面應用程式

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

  1. static class Program  
  2. {              
  3.     [STAThread]  
  4.     static void Main(string[] args)  
  5.     {  
  6.         Application.EnableVisualStyles();  
  7.         Application.SetCompatibleTextRenderingDefault(false);  
  8.         Application.Run(new Form1(args));  
  9.     }  
   

Form1.cs

  1. public partial class Form1 : Form  
  2. {  
  3.     public Form1()  
  4.     {  
  5.           
  6.     }  
  7.     public Form1(string[] args)              
  8.     {  
  9.         InitializeComponent();  
  10.         var data = args[0].Split(':');  
  11.         if (data.Length > 1)  
  12.         {  
  13.             label1.Text = data[1];  
  14.         }  
  15.         else 
  16.         {  
  17.             label1.Text = "no args";  
  18.         }  
  19.     }  
    

 

 

        (2) 接著我在電腦的機碼中新增自訂的 URI Protocol, 命名為 callbill,參考 Registering an Application to a URI Scheme

 

2013-11-03_160439_thumb

 

 

        (3) 最後新增一個 Windows 市集應用程式專案,在 UI 上放一個 Button ,為 Button.Click 事件撰寫委派函式如下

 

  1. async private void Button_Click(object sender, RoutedEventArgs e)  
  2. {  
  3.     string uriToLaunch = "callbill:Hello_Uri_Launcher";  
  4.     var result = await Windows.System.Launcher.LaunchUriAsync(new Uri(uriToLaunch ));             
        

 

        執行 Windows 市集應用程式,按下 Button 的最後結果

 

2013-11-03_161133

 

 

        如同我一開頭所講的就是這麼簡單,幾個輕鬆的步驟就可以完成『聽起來似乎很困難』的事情。