上一篇《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. .NET Standard 简介

    系列目录     [已更新最新开发文章,点击查看详细] .NET Standard 是一套正式的 .NET API 规范,有望在所有 .NET 实现中推出. 推出 .NET Standard 的背后动 ...

  2. Tomcat配置Gizp 客户端使用okHttp3

    找到tomcat 在 server.xml 新增如下配置 <Connector connectionTimeout="20000" port="8088" ...

  3. JavaWeb01_html&css

    一. html简介 1. 什么是html ①. HyperText Markup Language:超文本标记语言,是最基本的网页语言 ②. 超文本:超出文本范畴 ③. 标记:标记就是标签,html所 ...

  4. Linux Centos7 安装Docker-CE

    先确保yum 是最新版本 执行: sudo yum update 添加docker源地址 sudo yum-config-manager --add-repo https://download.doc ...

  5. CentOS 7的安装与部署 01

    01 虚拟软件的安装与配置 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.在实体计算机中能够完成的工作在虚拟机中都能够实现. ...

  6. 【图论】HDU 5961 传递

    题目内容 题目链接 我们称一个有向图G是传递的当且仅当对任意三个不同的顶点a,若G中有 一条边从a到b且有一条边从b到c ,则G中同样有一条边从a到c. 我们称图G是一个竞赛图,当且仅当它是一个有向图 ...

  7. canal 整合RabbitMQ

    环境如下: canal: 1.15-alpha-1 mysql  5.6.49 rabbitmq 3.7.14 Erlang 21.3 canal 安装和启动 见上篇文章 canal快速安装启动 但是 ...

  8. MySQL锁详细讲解

    本文章向大家介绍MySQL锁详细讲解,包括数据库锁基本知识.表锁.表读锁.表写锁.行锁.MVCC.事务的隔离级别.悲观锁.乐观锁.间隙锁GAP.死锁等等,需要的朋友可以参考一下   锁的相关知识又跟存 ...

  9. centos8上添加sudoer用户

    一,检查服务器是否已安装sudo的rpm包? 1,查询rpm包列表 [root@yjweb ~]# rpm -qa | grep sudo libsss_sudo-2.0.0-43.el8_0.3.x ...

  10. win10开机启动文件夹

    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp