Partilhe conteúdo da sua aplicação - integre o Windows Share

A Folha de Partilha do Windows é uma interface fornecida pelo sistema que permite aos utilizadores enviar conteúdo da sua aplicação para outras aplicações do Windows. Este guia explica como implementar o contrato de partilha entre aplicações empacotadas (MSIX), Progressive Aplicações Web (PWAs) e aplicações Win32 não empacotadas.

Neste artigo

Seção O que você vai encontrar
Escolha a sua abordagem de partilha Escolha o conjunto certo de APIs para aplicações UWP, desktop ou PWA
Implementar o Share para aplicações UWP DataTransferManager.GetForCurrentView e ShowShareUI
Implementar a funcionalidade de partilha para PWAs Integração com a API de Partilha Web
Implementar o Share em aplicações para ambiente de trabalho IDataTransferManagerInteroppartilha por janela para WinUI 3, WPF, WinForms
Eventos do lado da origem Observar a seleção, conclusão e cancelamento do alvo
Boas práticas para o Share Recomendações para um comportamento fiável do lado da fonte

Escolha a sua abordagem de partilha

Tipo de aplicação Abordagem Conjunto de APIs
Aplicações UWP Utilize DataTransferManager.GetForCurrentView e ShowShareUI Windows.ApplicationModel.DataTransfer
Aplicações de ambiente de trabalho (WinUI 3, WPF, WinForms) Usar IDataTransferManagerInterop para partilha por janela (empacotada ou não empacotada) Windows Runtime via interoperabilidade COM
Aplicações Web Progressivas (PWAs) Use a API de Partilha Web + integração com o Windows Partilha Web do W3C

Implementar o Share para aplicações UWP

Importante

DataTransferManager.GetForCurrentView e ShowShareUI são suportados apenas em aplicações UWP. As aplicações de ambiente de trabalho (WinUI 3, WPF ou WinForms - empacotadas ou não embaladas) devem usar o IDataTransferManagerInterop padrão mostrado em Implementar Partilha para aplicações de ambiente de trabalho.

1. Obtenha um DataTransferManager

Na inicialização da sua página, obtenha uma referência ao DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        DataTransferManager dtm = DataTransferManager.GetForCurrentView();
        dtm.DataRequested += OnDataRequested;
    }
}

2. Preencher um pacote de dados

Quando o utilizador inicia partilhar (por exemplo, clicar num botão de partilhar), crie um DataPackage com o conteúdo e os metadados:

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    DataRequest request = args.Request;
    DataPackage data = request.Data;

    // Set a title (required)
    data.Properties.Title = "My shared content";

    // Set content - choose one or more:
    data.SetText("Here's some text to share");

    // For URLs, use SetWebLink to enable rich link previews:
    // data.SetWebLink(new Uri("https://example.com"));

    // For files or images:
    // IStorageItem item = await StorageFile.GetFileFromPathAsync(filePath);
    // data.SetStorageItems(new[] { item });

    // Optional: add description and thumbnail
    data.Properties.Description = "A brief description";
    // data.Properties.Thumbnail = /* RandomAccessStreamReference */;
}

Tip

Quando partilhar uma URL, use SetWebLink (ou SetApplicationLink para links profundos) em vez de SetText. As aplicações de destino podem então gerar pré-visualizações ricas de links e gerir a navegação corretamente, em vez de as tratar como texto simples.

3. Mostrar a interface de partilha

Acione a Folha de Partilha com um clique de botão ou comando de menu:

private void ShareButton_Click(object sender, RoutedEventArgs e)
{
    // ShowShareUI is a static method on DataTransferManager.
    // The DataRequested handler was registered in step 1.
    DataTransferManager.ShowShareUI();
}

Implementar a partilha para Aplicações Web Progressivas (PWAs)

As PWAs utilizam a API de Partilha Web do W3C. Certifique-se de que a sua PWA tem as propriedades de manifesto necessárias para se integrar com o Windows:

{
  "name": "My PWA",
  "short_name": "MyPWA",
  "share_target": {
    "action": "/share",
    "method": "POST",
    "enctype": "multipart/form-data",
    "params": {
      "files": [
        {
          "name": "media",
          "accept": ["image/*"]
        }
      ]
    }
  }
}

No seu JavaScript PWA, use a Web Share API:

async function shareContent() {
  if (navigator.share) {
    try {
      await navigator.share({
        title: 'Check this out',
        text: 'Great content',
        url: 'https://example.com/page'
      });
    } catch (err) {
      if (err.name !== 'AbortError') {
        console.error('Share failed:', err);
      }
    }
  }
}

Implementar Partilha para aplicações de ambiente de trabalho (WinUI 3, WPF, WinForms)

As aplicações de ambiente de trabalho – sejam embaladas ou não – utilizam a IDataTransferManagerInterop interface para aceder à Folha de Partilha por janela. Isto aplica-se às aplicações WinUI 3, WPF e WinForms.

1. Declarar a interface de interoperabilidade e adquirir um DataTransferManager

using Windows.ApplicationModel.DataTransfer;

[System.Runtime.InteropServices.ComImport]
[System.Runtime.InteropServices.Guid("3A3DCD6C-3EAB-43DC-BCDE-45671CE800C8")]
[System.Runtime.InteropServices.InterfaceType(
    System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]
interface IDataTransferManagerInterop
{
    IntPtr GetForWindow([System.Runtime.InteropServices.In] IntPtr appWindow,
        [System.Runtime.InteropServices.In] ref Guid riid);
    void ShowShareUIForWindow(IntPtr appWindow);
}

public sealed partial class MainWindow // WinUI 3 Window, WPF Window, or WinForms Form
{
    // IID of DataTransferManager, passed as the riid to GetForWindow:
    static readonly Guid _dtm_iid =
        new Guid(0xa5caee9b, 0x8708, 0x49d1, 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c);

    private DataTransferManager _dtm;

    // Call this from your window or form constructor (or load handler):
    private void InitializeShare()
    {
        // Retrieve the window handle (HWND) for the current window:
        //   WinUI 3:  IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
        //   WPF:      IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
        //   WinForms: IntPtr hWnd = this.Handle;
        IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

        IDataTransferManagerInterop interop =
            DataTransferManager.As<IDataTransferManagerInterop>();
        _dtm = WinRT.MarshalInterface<DataTransferManager>.FromAbi(
            interop.GetForWindow(hWnd, _dtm_iid));

        _dtm.DataRequested += (sender, args) => OnDataRequested(args);
    }
}

2. Povoar e mostrar

private void OnDataRequested(DataRequestedEventArgs args)
{
    DataRequest request = args.Request;
    DataPackage data = request.Data;

    data.Properties.Title = "Share from my desktop app";
    data.SetText("Shared content");

    // For URLs:
    // data.SetWebLink(new Uri("https://example.com"));

    // For files:
    // var item = await StorageFile.GetFileFromPathAsync(filePath);
    // data.SetStorageItems(new[] { item });
}

// In your Share button handler:
private void ShareButton_Click()
{
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
    var interop = DataTransferManager.As<IDataTransferManagerInterop>();
    interop.ShowShareUIForWindow(hWnd);
}

Para um exemplo completo, veja o exemplo do WPF Share Source.

Eventos do lado da origem

Use estes eventos nas aplicações de origem para observar o que aconteceu depois de o utilizador abrir o Partilhar.

API Quando dispara Porquê utilizar
DataTransferManager.DataRequested O utilizador inicia uma operação de partilha Constrói e anexa o DataPackage
DataTransferManager.TargetApplicationChosen O utilizador escolhe uma aplicação-alvo Telemetria opcional para seleção de alvos
DataPackage.ShareCompleted A partilha está concluída Telemetria de sucesso opcional
DataPackage.ShareCanceled O utilizador cancela a partilha Telemetria de anulação opcional

Note

Este exemplo serve GetForCurrentView para brevidade, o que se aplica a aplicações UWP. Nas aplicações de ambiente de trabalho, adquira o DataTransferManager através de IDataTransferManagerInterop.GetForWindow, como mostrado anteriormente, e depois anexe os mesmos eventos.

private void RegisterShareEvents()
{
  var dtm = DataTransferManager.GetForCurrentView();
  dtm.DataRequested += OnDataRequested;
  dtm.TargetApplicationChosen += OnTargetChosen;
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
  DataRequest request = args.Request;
  request.Data.Properties.Title = "Share from my app";
  request.Data.SetText("Hello from Windows Share");

  request.Data.ShareCompleted += OnShareCompleted;
  request.Data.ShareCanceled += OnShareCanceled;
}

private void OnTargetChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args)
{
  // Optional: telemetry only
  Debug.WriteLine($"Target app: {args.ApplicationName}");
}

private void OnShareCompleted(DataPackage sender, ShareCompletedEventArgs args)
{
  Debug.WriteLine("Share completed");
}

private void OnShareCanceled(DataPackage sender, object args)
{
  Debug.WriteLine("Share canceled");
}

Note

DataPackage.OperationCompleted e DataPackage.Destroyed são principalmente para fluxos de trabalho de prancheta e colagem. Geralmente, não são necessárias para cenários de partilha de código-fonte.

Boas práticas para o Share

Use esta lista de verificação para manter o comportamento do lado da fonte previsível.

Recomendado Evitar Por que é importante
Utilize SetWebLink ou SetApplicationLink para URLs Utilize SetText para URLs Os links são apresentados e direcionam corretamente nas aplicações de destino
Defina Title e os metadados opcionais (Description, miniatura) Envio de conteúdo sem metadados Melhora a clareza da interface partilhada e a renderização dos alvos
Processa TargetApplicationChosen, ShareCompleted, e ShareCanceled se precisares de telemetria Partindo do princípio de que estes sinais vêm de ShareOperation em aplicações de origem Estes são sinais do lado da origem para informação após a partilha
Mantenha as cargas partilhadas específicas e válidas para a ação selecionada Enviar cargas úteis não relacionadas ou demasiado grandes por predefinição Reduz falhas e melhora a taxa de sucesso da partilha