Partager du contenu à partir de votre application - intégrer Windows Partager

La feuille de partage Windows est une interface utilisateur fournie par le système qui permet aux utilisateurs d’envoyer du contenu de votre application à d’autres applications Windows. Ce guide explique comment implémenter le contrat De partage entre les applications empaquetées (MSIX), les applications progressives Web Apps (PWA) et les applications Win32 non empaquetées.

Dans cet article

Rubrique Ce que vous trouverez
Choisir votre approche de partage Choisir l’ensemble d’API approprié pour les applications UWP, de bureau ou PWA
Implémenter le partage dans les applications UWP DataTransferManager.GetForCurrentView et ShowShareUI
Implémenter la fonctionnalité de partage pour les PWA Intégration de l’API Web Share
Implémenter Share pour les applications de bureau IDataTransferManagerInteroppartage par fenêtre pour WinUI 3, WPF, WinForms
Événements côté source Surveiller la sélection de la cible, la finalisation et l’annulation
Meilleures pratiques pour partager Recommandations pour un comportement fiable côté source

Choisir votre approche de partage

Type d’application Approach Ensemble d’API
Applications UWP Utiliser DataTransferManager.GetForCurrentView et ShowShareUI Windows.ApplicationModel.DataTransfer
Applications de bureau (WinUI 3, WPF, WinForms) Utiliser IDataTransferManagerInterop pour le partage par fenêtre (empaqueté ou non empaqueté) Windows Runtime via COM Interop
Applications Web progressives (PWA) Utiliser l’API Web Share + intégration Windows W3C Web Share

Implémenter share pour les applications UWP

Important

DataTransferManager.GetForCurrentView et ShowShareUI sont pris en charge uniquement dans les applications UWP. Les applications de bureau (WinUI 3, WPF ou WinForms - empaquetées ou non empaquetées) doivent utiliser le IDataTransferManagerInterop modèle indiqué dans Implémenter share pour les applications de bureau.

1. Obtenir un DataTransferManager

Dans l’initialisation de votre page, obtenez une référence au DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

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

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

2. Remplir un DataPackage

Lorsque l’utilisateur lance le partage (par exemple, cliquez sur un bouton Partager), créez-en un DataPackage avec le contenu et les métadonnées :

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

Lorsque vous partagez une URL, utilisez SetWebLink (ou SetApplicationLink pour des liens profonds) au lieu de SetText. Les applications cibles peuvent ensuite générer des aperçus de liens enrichis et gérer la navigation correctement, au lieu de les traiter comme du texte brut.

3. Afficher l’interface utilisateur de partage

Déclenchez la feuille de partage à partir d’un clic de bouton ou d’une commande 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();
}

Implémenter le partage pour les Progressive Web Apps (PWA)

Les PWA utilisent l’API Web Share du W3C. Vérifiez que votre PWA a les propriétés de manifeste requises pour s’intégrer à Windows :

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

Dans votre code JavaScript PWA, utilisez l’API De partage web :

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

Implémenter le partage pour les applications de bureau (WinUI 3, WPF, WinForms)

Les applications de bureau , qu’elles soient empaquetées ou non empaquetées, utilisent l’interface IDataTransferManagerInterop pour accéder à la feuille de partage par fenêtre. Cela s’applique aux applications WinUI 3, WPF et WinForms.

1. Déclarer l’interface d’interopérabilité et acquérir 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. Remplir et afficher

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

Pour obtenir un exemple complet, consultez l’exemple WPF Share Source.

Événements côté source

Utilisez ces événements dans les applications sources pour observer ce qui s’est passé après l’ouverture du partage par l’utilisateur.

API Quand il se déclenche Pourquoi l'utiliser ?
DataTransferManager.DataRequested L’utilisateur démarre une opération de partage Générer et attacher le DataPackage
DataTransferManager.TargetApplicationChosen L’utilisateur choisit une application cible Télémétrie facultative pour la sélection cible
DataPackage.ShareCompleted Le partage se termine Télémétrie de succès facultative
DataPackage.ShareCanceled L’utilisateur annule le partage Télémétrie d’annulation optionnelle

Note

Cet exemple utilise GetForCurrentView pour la concision, qui s’applique aux applications UWP. Dans les applications de bureau, obtenez le DataTransferManager au moyen de IDataTransferManagerInterop.GetForWindow, comme indiqué précédemment, puis associez les mêmes événements.

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 et DataPackage.Destroyed sont principalement destinés aux workflows de presse-papiers et de collage. Elles ne sont généralement pas nécessaires pour les scénarios de source de partage.

Meilleures pratiques pour partager

Utilisez cette liste de contrôle pour maintenir le comportement côté source prévisible.

Recommandé Éviter Pourquoi cela se produit-il
Utiliser SetWebLink ou SetApplicationLink pour les URL Utiliser SetText pour les URL Les liens s’affichent et routent correctement dans les applications cibles
Définir Title et les métadonnées facultatives (Description, miniature) Envoi de contenu sans métadonnées Améliore la clarté de l’interface utilisateur de partage et le rendu cible
Gérer TargetApplicationChosen, ShareCompletedet ShareCanceled si vous avez besoin de télémétrie En supposant que ces signaux proviennent de ShareOperation dans les applications sources Il s’agit de signaux côté source pour obtenir des insights post-partage
Conserver les charges utiles partagées prioritaires et valides pour l’action sélectionnée Envoi de charges utiles non liées ou surdimensionnées par défaut Réduit les échecs et améliore le taux de réussite des partages