上一篇《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. 深入了解如何构建您的第一个多语言ASP。NET MVC 5 Web应用程序

    下载demo - 3.9 MB 介绍 这篇文章解释了如何创建一个简单的多语言ASP.NET MVC 5 Web应用程序.该应用程序将能够处理英语(美国),西班牙语和法语.英语将是默认语言.当然,扩展解 ...

  2. SpringCache整合Redis

    之前一篇文章 SpringBoot整合Redis 已经介绍了在SpringBoot中使用redisTemplate手动 操作redis数据库的方法了.其实这个时候我们就已经可以拿redis来做项目了, ...

  3. 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)

    前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题.性能问题一般用什么来解决呢?小明第一时间想到了缓存. 什么是缓存 缓存是实际工作中非常常用的 ...

  4. 多测师讲解pyhon__hashlib_高级讲师肖sir

    一.加密,加密成16进制的字符串 # import hashlib # 导入hashlib模块# md = hashlib.md5() # 获取一个md5加密算法对象# md.update('需要加密 ...

  5. es6深层次数组深拷贝

    let arr = [       {         label: '1',         children: [1, 2]       }     ] let a = [{...arr[0]}] ...

  6. Termux基础教程(一):技能部署

    Termux基础教程 by CUCI Termux 是一个 Android 下一个高级的终端模拟器,开源且不需要 root,支持 apt 管理软件包,十分方便安装软件包,完美支持 Python. PH ...

  7. spring boot:用dynamic-datasource-spring-boot-starter配置多数据源访问seata(seata 1.3.0 / spring boot 2.3.3)

    一,dynamic-datasource-spring-boot-starter的优势? 1,dynamic-datasource-spring-boot-starter 是一个基于springboo ...

  8. 如何使用dos,以及一些简单的dos命令

    一. 如何打开dos窗口    1. 按下 windos键 alt  ctrl 之间的键        或者打开开始 菜单  输入 cmd 名令    2. win + r 键 输入 cmd 打开 d ...

  9. 如何安装一个高可用K3s集群?

    作者介绍 Janakiram MSV是Janakiram & Associates的首席分析师,也是国际信息技术学院的兼职教师.他也是Google Qualified Developer.亚马 ...

  10. MySQL全面瓦解5:数据操作-DML

    说明 DML(Data Manipulation Language)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT.UPDATE.DELETE三种,代表插入.更新与删除,这是学习M ...