Condividere contenuto dall'app: integrare Windows Condivisione

Il foglio di condivisione Windows è un'interfaccia utente fornita dal sistema che consente agli utenti di inviare contenuto dall'app ad altre app Windows. Questa guida illustra come implementare il contratto di condivisione tra app in pacchetto (MSIX), progressive App Web (PWA) e app Win32 senza pacchetti.

In questo articolo

Sezione Cosa troverai
Scegliere l'approccio di condivisione Selezionare il set di API corretto per le app UWP, desktop o PWA
Implementa la condivisione per le app UWP DataTransferManager.GetForCurrentView e ShowShareUI
Implementa la condivisione per PWA Integrazione dell'API Di condivisione Web
Implementare la condivisione nelle applicazioni desktop IDataTransferManagerInteropCondivisione per finestra per WinUI 3, macchine virtuali Windows, WinForms
Eventi lato sorgente Osserva la selezione, il completamento e l'annullamento dell'obiettivo
Procedure consigliate per la condivisione Raccomandazioni per un comportamento affidabile sul lato origine

Scegliere l'approccio di condivisione

Tipo di app Avvicinarsi Set di API
App UWP Usare DataTransferManager.GetForCurrentView ed ShowShareUI Windows.ApplicationModel.DataTransfer
Applicazioni desktop (WinUI 3, macchine virtuali Windows, WinForms) Usare IDataTransferManagerInterop per la condivisione per finestra (in pacchetto o senza pacchetto) Windows Runtime con interoperabilità COM
App Web Progressive (PWA) Usare l'API di condivisione Web e l'integrazione di Windows W3C Web Share

Implementare la condivisione per le app UWP

Importante

DataTransferManager.GetForCurrentView e ShowShareUI sono supportati solo nelle app UWP. Le applicazioni desktop (WinUI 3, macchine virtuali Windows o WinForms, con o senza pacchetto) devono usare il modello IDataTransferManagerInterop illustrato in Implementare la condivisione per le applicazioni desktop.

1. Ottenere un DataTransferManager

Durante l'inizializzazione della pagina, ottieni un riferimento a DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

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

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

2. Popolare un pacchetto di dati

Quando l'utente avvia la condivisione (ad esempio, fa clic su un pulsante Condividi), crea un DataPackage oggetto con il contenuto e i metadati:

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 si condivide un URL, usare SetWebLink (o SetApplicationLink per i collegamenti diretti) anziché SetText. Le app di destinazione possono quindi generare anteprime avanzate dei link e gestire correttamente la navigazione, invece di trattarli come semplice testo.

3. Mostra l'interfaccia utente di condivisione

Attivare il foglio di condivisione da un pulsante o un comando di 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();
}

Implementare la condivisione per i App Web progressivi (PWA)

Le app PWA usano l'API Web Share del W3C. Assicurarsi che la PWA disponga delle proprietà richieste del manifest per integrarsi con Windows:

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

Nel codice JavaScript della tua PWA, usa l'API Web Share:

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);
      }
    }
  }
}

Implementa la condivisione per le app desktop (WinUI 3, macchine virtuali Windows, WinForms)

Le app desktop, sia in pacchetto che non in pacchetto, usano l'interfaccia IDataTransferManagerInterop per accedere al foglio di condivisione in base a ogni finestra. Questo vale per le app WinUI 3, macchine virtuali Windows e WinForms.

1. Dichiarare l'interfaccia di interoperabilità e ottenere un 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. Compilare e mostrare

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);
}

Per un esempio completo, consulta il sample macchine virtuali Windows Share Source.

Eventi lato origine

Usare questi eventi nelle app di origine per osservare cosa è successo dopo l'apertura della condivisione da parte dell'utente.

API Quando viene attivato Perché usarlo
DataTransferManager.DataRequested L'utente avvia un'operazione di condivisione Compilare e collegare DataPackage
DataTransferManager.TargetApplicationChosen L'utente sceglie un'app di destinazione Telemetria facoltativa per la selezione della destinazione
DataPackage.ShareCompleted La condivisione è completata Telemetria di esito positivo facoltativo
DataPackage.ShareCanceled L'utente annulla la condivisione Telemetria di annullamento facoltativa

Annotazioni

Questo esempio usa GetForCurrentView per brevità, che si applica alle app UWP. Nelle app desktop acquisire il DataTransferManager tramite IDataTransferManagerInterop.GetForWindow come illustrato in precedenza, quindi allegare gli stessi eventi.

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");
}

Annotazioni

DataPackage.OperationCompleted e DataPackage.Destroyed sono usati principalmente per gli Appunti e per i flussi di lavoro di incolla. In genere non sono necessari per gli scenari di origine di Share.

Procedure consigliate per la condivisione

Usare questo elenco di controllo per mantenere prevedibile il comportamento sul lato origine.

Raccomandato Evitare Perché è importante
Usare SetWebLink o SetApplicationLink per gli URL Usare SetText per gli URL I collegamenti vengono visualizzati e indirizzano correttamente nelle app di destinazione
Impostare Title e i metadati opzionali (Description, miniatura) Invio di contenuto senza metadati Migliora la chiarezza e il rendering della destinazione dell'interfaccia utente di condivisione
Gestire TargetApplicationChosen, ShareCompletede ShareCanceled se sono necessari dati di telemetria Supponendo che questi segnali provengano da ShareOperation nelle app di origine Questi sono segnali lato origine per l'analisi successiva alla condivisione
Mantenere concentrati i payload condivisi e validi per l'azione selezionata Invio di payload non correlati o sovradimensionati per impostazione predefinita Riduce i fallimenti e migliora il tasso di successo della condivisione