将打包的应用与 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
}

另请参阅