Sdílejte obsah ze své aplikace – integrujte sdílení ve Windows

Panel Sdílet ve Windows je uživatelské rozhraní poskytované systémem, které uživatelům umožňuje sdílet obsah z vaší aplikace do dalších aplikací ve Windows. Tato příručka vysvětluje, jak implementovat kontrakt Share napříč aplikacemi MSIX v balíčku, progresivními webovými aplikacemi (PWA) a nebalenými aplikacemi Win32.

Oddíl Co najdete
Volba přístupu ke sdílení Vyberte správnou sadu rozhraní API pro aplikace UWP, desktopové aplikace nebo aplikace PWA
Implementace sdílení pro aplikace pro UPW DataTransferManager.GetForCurrentView a ShowShareUI
Implementujte sdílení pro PWA Integrace rozhraní API služby Web Share
Implementace sdílení pro desktopové aplikace IDataTransferManagerInteropsdílení jednotlivých oken pro WinUI 3, WPF (Windows Presentation Foundation), WinForms
Události na straně zdroje Sledování výběru cíle, dokončení a zrušení
Osvědčené postupy pro sdílení Doporučení pro spolehlivé chování na straně zdroje

Volba přístupu ke sdílení

Typ aplikace Přístup Sada rozhraní API
Aplikace pro UPW Použijte DataTransferManager.GetForCurrentView a ShowShareUI Windows.ApplicationModel.DataTransfer
Desktopové aplikace (WinUI 3, WPF (Windows Presentation Foundation), WinForms) Použijte IDataTransferManagerInterop pro sdílení jednotlivých oken (pro balené i nebalené aplikace) prostředí Windows Runtime přes zprostředkovatele komunikace s objekty COM
Progresivní webové aplikace (PWA) Použijte rozhraní API Web Share a integraci se systémem Windows W3C Web Share

Implementovat sdílení v aplikacích UWP

Important

DataTransferManager.GetForCurrentView a ShowShareUI podporují se jenom v aplikacích pro UPW. Desktopové aplikace (WinUI 3, WPF (Windows Presentation Foundation) nebo WinForms – balené i nebalené) musí používat vzor IDataTransferManagerInterop, který je uvedený v článku Implementace funkce Sdílení pro desktopové aplikace.

1. Získání dataTransferManageru

V inicializaci stránky získejte odkaz na DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

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

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

2. Naplnění datového balíčku

Když uživatel zahájí sdílení (například klikne na tlačítko Sdílet), vytvořte DataPackage s obsahem a metadaty:

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

Když sdílíte adresu URL, použijte SetWebLink (nebo SetApplicationLink pro přímé odkazy) místo SetText. Cílové aplikace pak mohou generovat bohaté náhledy odkazů a správně obsluhovat navigaci, místo aby je považovaly jen za prostý text.

3. Zobrazení uživatelského rozhraní pro sdílení

Vyvolejte panel Sdílení stisknutím tlačítka nebo pomocí příkazu nabídky:

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

Implementujte sdílení pro progresivní webové aplikace (PWA)

PWA používají rozhraní W3C Web Share API. Ujistěte se, že aplikace PWA má požadované vlastnosti manifestu pro integraci s Windows:

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

V jazyce JavaScript ve vaší aplikaci PWA použijte rozhraní 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);
      }
    }
  }
}

Implementace sdílení pro desktopové aplikace (WinUI 3, WPF (Windows Presentation Foundation), WinForms)

Desktopové aplikace – ať už zabalené i nezabalené – používají rozhraní IDataTransferManagerInterop pro přístup k Share Sheetu pro každé okno zvlášť. To platí pro aplikace WinUI 3, WPF (Windows Presentation Foundation) a WinForms.

1. Deklarujte rozhraní vzájemné spolupráce a získejte 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. Naplnění a zobrazení

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

Kompletní příklad viz v ukázce WPF (Windows Presentation Foundation) Share Source.

Události na straně zdroje

Pomocí těchto událostí ve zdrojových aplikacích můžete sledovat, co se stalo po otevření funkce Sdílet uživatelem.

API Když dojde k požáru Proč ho použít
DataTransferManager.DataRequested Uživatel spustí operaci sdílení. Sestavte a připojte DataPackage
DataTransferManager.TargetApplicationChosen Uživatel zvolí cílovou aplikaci. Volitelná telemetrie pro výběr cíle
DataPackage.ShareCompleted Sdílení je dokončeno. Volitelná telemetrie úspěšnosti
DataPackage.ShareCanceled Uživatel zruší sdílení. Telemetrie volitelného zrušení

Note

Tento příklad používá kvůli stručnosti GetForCurrentView, což se vztahuje na aplikace UWP. V desktopových aplikacích získejte DataTransferManager prostřednictvím IDataTransferManagerInterop.GetForWindow , jak je znázorněno výše, a pak připojte stejné události.

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 a DataPackage.Destroyed slouží především k práci se schránkou a vkládání. Obecně nejsou potřeba pro scénáře sdíleného zdroje.

Osvědčené postupy pro sdílení

Pomocí tohoto kontrolního seznamu můžete zachovat předvídatelné chování na straně zdroje.

Doporučený Vyhněte se Proč je to důležité
Použití SetWebLink nebo SetApplicationLink pro adresy URL Použití SetText pro adresy URL Odkazy se v cílových aplikacích vykreslují a směrují správně.
Nastavení Title a volitelná metadata (Description, miniatura) Odesílání obsahu bez metadat Zlepšuje přehlednost uživatelského rozhraní Pro sdílení a cílové vykreslování.
Zpracujte TargetApplicationChosen, ShareCompleted a ShareCanceled, pokud potřebujete telemetrii Za předpokladu, že tyto signály pocházejí ze ShareOperation zdrojových aplikací Jedná se o signály na straně zdroje pro přehled po sdílení.
Zachovat prioritní a platnou sdílenou datovou část pro vybranou akci Ve výchozím nastavení se odesílají nesouvisející nebo příliš velká data Snižuje selhání a zlepšuje úspěšnost sdílení.