上一篇《2020年的UWP(2)——In Process App Service》中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互。本篇我们就来梳理在不同场景,UWP和Desktop Extension可能存在的交互方式。

对Desktop Extension中程序的类型,我暂时分为以下四种:

  • 执行后立即退出
  • 等待request,处理完后退出
  • 一或多个request/response周期
  • 和UWP程序相同生命周期

本篇我们仅讨论第一种,Desktop Extension中执行后立即退出的程序。该类型有以下特征:

  1. 简单的单向调用:
  2. 不接受request
  3. 不关心返回结果
  4. 调用后立即退出

下图是该类型交互场景的示意图。通过FullTrustProcessLauncher从UWP端启动Desktop Extension,我已在《迁移桌面程序到MS Store(9)——APPX With Desktop Extension》介绍过了,本篇不再赘述。

比较典型的如执行某个特定操作,例如调用LockScreen的Win32 API。

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

我们观察从UWP端启动Desktop Extension的代码:

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

LaunchFullTrustProcessForCurrentAppAsync方法没有传递参数给LockScreen方法,也不关心返回值。启动Desktop Extension后也不会通过AppService进一步发送request。
似乎和本篇的主题,数据交互毫不相关。但实际情况下,一个Desktop Extension的exe中,会有多个像LockScreen这种一次性的消费型方法。这就要求我们能够区分UWP端具体要执行哪一个。
首先我们来介绍标准的做法,给LaunchFullTrustProcessForCurrentAppAsync方法传参。

public static IAsyncAction LaunchFullTrustProcessForCurrentAppAsync(string parameterGroupId);

这里要注意的是。这里所谓的参数parameterGroupId,不会传递到Desktop Extension的Main方法里。而是用这个string参数去Package.appxmanifest文件中做匹配,在Package.appxmanifest文件中对应的那个字符串才会被传递给Main方法。

  <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。不提示的话,很难想到在同一个Package里的UWP和Desktop Extension,是可以访问相同的LocalSettings对象的。
在UWP的MainPage.cs中,我们将“mspaint.exe”存储到key为“content”的LocalSettings键值对中。

        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

2020年的UWP(3)——UWP和desktop extension的简单交互的更多相关文章

  1. 2020年的UWP(5)——UWP和Desktop Extension的双向交互

    上一篇我们提到了怎么在Desktop Extension中等待并处理UWP端发出的request.在本篇中将描述UWP和Desktop Extension双向交互的场景,即存在从两端各自发出reque ...

  2. 2021年的UWP(6)——长生命周期Desktop Extension向UWP的反向通知

    上一篇我们讨论了UWP和Desktop Extension间的双向通讯,适用于Desktop Extension中存在用户交互的场景.本篇我们讨论最后一种情况,与前者不同的是,Desktop Exte ...

  3. 2020年的UWP(4)——UWP和等待Request的Desktop Extension

    上一篇我们讨论了UWP和Desktop Extension交互中,Desktop Extension执行后立即退出的场景.下图是提到的四种场景分类: 执行后立即退出 等待request,处理完后退出 ...

  4. UWP入门(八)--几个简单的控件

    原文:UWP入门(八)--几个简单的控件 每天看几个,要不聊几天我就可以看完啦,加油! 看效果 1. CheckBox <TextBlock Grid.Row="0" Tex ...

  5. uwp开发:数据绑定——值转换器 的简单使用

    原文:uwp开发:数据绑定--值转换器 的简单使用 今天,我在做最近正在开发的“简影”uwp应用时遇到一个问题,其中有个栏目,叫做“画报”,是分组显示一组一组的 图片,每组图片在界面上只显示9个,点击 ...

  6. 迁移桌面程序到MS Store(9)——APPX With Desktop Extension

    在<迁移桌面程序到MS Store(8)——通过APPX下载Win32Component>中我们讨论了通过APPX来下载Service部分的安装包.但是纯UWP的客户端并不能自动运行下载的 ...

  7. [UWP]涨姿势UWP源码——极简的RSS阅读器

    涨姿势UWP,一个开源的RSS阅读器,一个纯粹的项目,一个有道德的APP,一个脱离了低级趣味的作者,一些有益于人民的代码.骚年,还等什么,来涨点姿势吧! 该项目代码可能会引起部分人群的不适,敏感人群请 ...

  8. UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)

    在做MVVM各种框架对比之前,我觉得有必要先自己做一个简单的MVVM实现案例比较好,这样就可以看到自己实现的时候有那些不方便的地方.而各种框架又是怎么解决我们这些麻烦的. 案例介绍:用户登录画面,没有 ...

  9. [UWP]涨姿势UWP源码——Unit Test

    之前我们讨论了涨姿势UWP的RSS数据源获取,以及作为文件存储到本地,再将数据转化成Model对象.这部分非UI的内容非常适合添加Unit Test.不涉及UI的话,UT写起来简单高效,很是值得投入一 ...

随机推荐

  1. 【题解】[USACO13FEB]Tractor S

    题目戳我 \(\text{Solution:}\) 好久没写啥\(dfs\)了,借这个题整理下细节. 观察到答案具有二分性,所以先求出其差的最大最小值,\(\log val\)的复杂度不成问题. 考虑 ...

  2. 计数,dic的创建方式,求九九乘法表

    s1='char,python,nihao,ni,ni,python's=s1.split(',')print(s1)s2=list()for i in s: if i not in s2: s2.a ...

  3. 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用

    [Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...

  4. vue-integer-plusminus

    下载 vue-integer-plusminusvue-integer-plusminus 带有递增和递减按钮的整数输入 现场演示 该组件适合作为自旋按钮,允许键盘功能(向上/向下箭头或页面向上/向下 ...

  5. str常用操作方法

    1. 索引(即下标) s = 'ABCDEFGHIJKLMN' s1 = s[0] print('s[0] = ' + s1) #s[0] = A print('s[3] = '+ s[3]) #s[ ...

  6. 多测师讲解 ———python2和Python3区别

    python3.x和python2.x的区别:1.Python3.X源码文件默认使用utf-8编码,而python2.x的编译最前端需要加上#coding=utf-82.python3.x里打印pri ...

  7. uc浏览器手机版,页面图片不显示

    uc浏览器手机版,有时候上面的轮播广告看不到 原因:uc浏览器会拦截所有带ad的标签 例如: <div id="adDiv"> <img src="/r ...

  8. 正式班D9

    2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...

  9. linux学习(二)--setup.s

    执行过bootsect.s,加载了所有系统代码之后,开始向32位模式转变,为main函数的调用做准备,同样,附上图往下看 1 INITSEG = 0x9000 ! we move boot here ...

  10. go 参数传递的是值还是引用 (转)

    https://blog.csdn.net/qq_16059847/article/details/104062759