2020年的UWP(3)——UWP和desktop extension的簡單交互

上一篇《2020年的UWP(2)——In Process App Service》中咱們瞭解了UWP和Desktop Extension能夠經過AppService進行數據交互。本篇咱們就來梳理在不一樣場景,UWP和Desktop Extension可能存在的交互方式。html

對Desktop Extension中程序的類型,我暫時分爲如下四種:git

  • 執行後當即退出
  • 等待request,處理完後退出
  • 一或多個request/response週期
  • 和UWP程序相同生命週期

本篇咱們僅討論第一種,Desktop Extension中執行後當即退出的程序。該類型有如下特徵:github

  1. 簡單的單向調用:
  2. 不接受request
  3. 不關心返回結果
  4. 調用後當即退出

下圖是該類型交互場景的示意圖。經過FullTrustProcessLauncher從UWP端啓動Desktop Extension,我已在《遷移桌面程序到MS Store(9)——APPX With Desktop Extension》介紹過了,本篇再也不贅述。windows

比較典型的如執行某個特定操做,例如調用LockScreen的Win32 API。app

    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool LockWorkStation();

        static void Main(string[] args)
        {
                LockWorkStation();
        }
    }

咱們觀察從UWP端啓動Desktop Extension的代碼:async

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
        }

LaunchFullTrustProcessForCurrentAppAsync方法沒有傳遞參數給LockScreen方法,也不關心返回值。啓動Desktop Extension後也不會經過AppService進一步發送request。
彷佛和本篇的主題,數據交互絕不相關。但實際狀況下,一個Desktop Extension的exe中,會有多個像LockScreen這種一次性的消費型方法。這就要求咱們可以區分UWP端具體要執行哪個。
首先咱們來介紹標準的作法,給LaunchFullTrustProcessForCurrentAppAsync方法傳參。ide

public static IAsyncAction LaunchFullTrustProcessForCurrentAppAsync(string parameterGroupId);

這裏要注意的是。這裏所謂的參數parameterGroupId,不會傳遞到Desktop Extension的Main方法裏。而是用這個string參數去Package.appxmanifest文件中作匹配,在Package.appxmanifest文件中對應的那個字符串纔會被傳遞給Main方法。spa

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="DataExchangeSimpleCallPackage"
        Description="DataExchangeSimpleCallPackage"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>
        <Extensions>
            <desktop:Extension Category="windows.fullTrustProcess" Executable="ExistAfterCallsProgram\ExistAfterCallsProgram.exe">
                <desktop:FullTrustProcess>
                    <desktop:ParameterGroup GroupId="LockScreen" Parameters="LockScreen" />
                    <desktop:ParameterGroup GroupId="ControlPanel" Parameters="ControlPanel" />
                </desktop:FullTrustProcess>
            </desktop:Extension>
        </Extensions>
    </Application>
  </Applications>

由於都是寫死的字符串,除了用來區分Desktop Extension中數量有限的方法外,並不適合做爲一種靈活的傳參方式用於具體方法的邏輯判斷。
一般意義上的靈活傳參給Desktop Extension,基本都是經過AppService來實現,在介紹另外三種類型時會展開討論。
在不使用AppService的簡單交互場景,除了欽定的使用parameterGroupId的作法外。還有一種容易被忽視的方式,即便用LocalSettings。code

不提示的話,很難想到在同一個Package裏的UWP和Desktop Extension,是能夠訪問相同的LocalSettings對象的。
在UWP的MainPage.cs中,咱們將「mspaint.exe」存儲到key爲「content」的LocalSettings鍵值對中。htm

        private async void ButtonLocalSettings_Click(object sender, RoutedEventArgs e)
        {
            ApplicationData.Current.LocalSettings.Values["content"] = "mspaint.exe";
            await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("LocalSettings");
        }

而在Desktop Extension中,咱們一樣也能夠取到這個值,從而達成數據交互的目的。在這個例子中,咱們能夠傳遞須要運行的exe、msi文件名或路徑,而不用爲每個文件建立單獨的parameterGroupId。

        static void Main(string[] args)
        {
            string funcName = args[2];
            switch (funcName)
            {
                case "LockScreen":
                    LockWorkStation();
                    break;
                case "ControlPanel":
                    Process.Start("control.exe");
                    break;
                case "LocalSettings":
                    var content = ApplicationData.Current.LocalSettings.Values["content"].ToString();
                    Process.Start(content);
                    break;
            }
        }

本篇討論了UWP和Desktop Extension的簡單數據交互,「執行後當即退出」的場景。後續咱們會接着講另外的三種類型,感謝看到這裏的同窗們!
Github:
https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/DataExchangeUWP/ExitAfterCalls

相關文章
相關標籤/搜索