将打包的应用与 Windows 共享集成
本文介绍如何将打包的应用与 Windows 共享功能集成。 使用 MSIX 打包的应用具有包标识,且已可注册为共享目标。 此“共享”功能允许用户将内容从一个应用共享到另一应用。 打包的应用将注册为共享目标,以便接收和处理此应用中的共享文件。
什么是共享目标?
共享目标是在 Windows 8 中引入的一项功能,它允许某一应用从另一应用接收数据。 共享目标的工作方式类似于剪贴板,但它具有动态内容。
若要使默认共享目标注册可与 Win32 应用搭配使用,应用则需具有包标识,并将共享参数作为 ShareTargetActivatedEventArgs(源应用中的实时对象)进行处理。 它不是发送到目标应用的静态内存内容。
注意
在 C++ 应用中,请使用 GetCurrentPackageFullName API 来检查正在运行的应用是否具有包标识。 如果此应用未使用包标识来运行,该 API 则会返回 APPMODEL_ERROR_NO_PACKAGE
错误代码。
先决条件
若要支持 ShareTargetActivatedEventArgs
,应用则须将 Windows 10 版本 2004(内部版本 10.0.19041.0)或更高版本作为目标。 它是此功能的最低目标版本。
注册为共享目标
在应用中实现“共享”合约需执行两个步骤。
将共享目标扩展添加到 appxmanifest
在 Visual Studio 的解决方案资源管理器中,打开解决方案中“打包”项目的 package.appxmanifest
文件并添加此共享目标扩展。
<Extensions>
<uap:Extension
Category="windows.shareTarget">
<uap:ShareTarget>
<uap:SupportedFileTypes>
<uap:SupportsAnyFileType />
</uap:SupportedFileTypes>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
</Extensions>
将应用程序支持的数据格式添加到 DataFormat
配置。 在此情况下,该应用支持共享图像,因此需将 DataFormat
设为 Bitmap
。
提取共享事件参数
从 Windows 10 1809 版开始,打包的应用可调用 AppInstance.GetActivatedEventArgs 方法,以便在启动过程中检索某些类型的应用激活信息。 例如,可调用此方法来获取有关应用激活的信息;无论它是通过打开某一文件、单击交互式 Toast 还是使用已注册的某一协议来触发。
但是,仅 Windows 10 2004 版及更高版本支持 ShareTargetActivatedEventArgs 激活信息。 因此,该应用程序应将具有此特定最低版本的设备作为目标。
若要查看 Windows 应用 SDK 实现,请参阅“共享目标”示例应用中的 OnLaunched
方法。
对于其他打包的应用,请在该应用程序的 Main
方法中检查是否存在 AppInstance.GetActivatedEventArgs
。
public static void Main(string[] cmdArgs)
{
...
if (isRunningWithIdentity())
{
var activationArgs = AppInstance.GetActivatedEventArgs();
if (activationArgs != null)
{
switch (activationArgs.Kind)
{
case ActivationKind.Launch:
HandleLaunch(activationArgs as LaunchActivatedEventArgs);
break;
case ActivationKind.ToastNotification:
HandleToastNotification(activationArgs as ToastNotificationActivatedEventArgs);
break;
case ActivationKind.ShareTarget:
HandleShareAsync(activationArgs as ShareTargetActivatedEventArgs);
break;
default:
HandleLaunch(null);
break;
}
}
}
}
有关完整实现,请参阅 Photo Store Demo 应用。
处理共享文件
以下代码片段演示了如何处理打包应用中的共享文件。 此代码片段是上一示例中将应用激活为共享目标时所调用 HandleShareAsync
方法的其中一部分。
static async void HandleShareAsync(ShareTargetActivatedEventArgs args)
{
ShareOperation shareOperation = args.ShareOperation;
shareOperation.ReportStarted();
if (shareOperation.Data.Contains(
Windows.ApplicationModel.DataTransfer.StandardDataFormats.StorageItems))
{
try
{
IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
var file = (IStorageFile)items[0];
string path = file.Path;
var image = new ImageFile(path);
image.AddToCache();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
shareOperation.ReportCompleted();
// app launch code
}