Uygulamanızdan içerik paylaşın - Windows Paylaşımı'nı tümleştirin

Windows Paylaşım Sayfası, kullanıcıların uygulamanızdan diğer Windows uygulamalarına içerik göndermesine olanak tanıyan sistem tarafından sağlanan bir kullanıcı arabirimidir. Bu kılavuzda, Paketlenmiş uygulamalar (MSIX), Aşamalı Web Apps (PWA' lar) ve paketlenmemiş Win32 uygulamaları arasında Paylaşım sözleşmesinin nasıl uygulanacakları açıklanmaktadır.

Bölüm Ne bulacaksınız?
Paylaşım yaklaşımınızı seçin UWP, masaüstü veya PWA uygulamaları için doğru API kümesini seçin
UWP uygulamaları için Paylaşım uygulama DataTransferManager.GetForCurrentView ve ShowShareUI
PWA'lar için paylaşımı uygulayın Web Share API entegrasyonu
Masaüstü uygulamaları için Paylaş özelliğini uygulama IDataTransferManagerInteropWinUI 3, WPF, WinForms için pencere başına paylaşım
Kaynak tarafı olayları Hedef seçimi, tamamlanmayı ve iptali gözlemleme
Paylaşım için en iyi yöntemler Güvenilir kaynak tarafı davranışı için öneriler

Paylaşım yaklaşımınızı seçin

Uygulama türü Yaklaşım API kümesi
UWP uygulamaları DataTransferManager.GetForCurrentView ve ShowShareUI kullanın Windows.ApplicationModel.DataTransfer
Masaüstü uygulamaları (WinUI 3, WPF, WinForms) Pencere başına paylaşım (paketlenmiş veya paketlenmemiş) için kullanın IDataTransferManagerInterop COM birlikte çalışma aracılığıyla Windows Çalışma Zamanı
Aşamalı Web Uygulamaları (PWA) Web Paylaşımı API'sini + Windows tümleştirmesini kullanma W3C Web Paylaşımı

UWP uygulamaları için Paylaşım uygulama

Important

DataTransferManager.GetForCurrentView ve ShowShareUI yalnızca UWP uygulamalarında desteklenir. Masaüstü uygulamaları (WinUI 3, WPF veya WinForms - paketlenmiş veya paketlenmemiş) IDataTransferManagerInterop bölümünde gösterilen deseni kullanmalıdır.

1. DataTransferManager edinin

Sayfa başlatma sırasında, DataTransferManager öğesine bir referans alın:

using Windows.ApplicationModel.DataTransfer;

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

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

2. DataPackage'i Doldurma

Kullanıcı paylaşımı başlattığında (örneğin, bir Paylaş düğmesine tıkladığında), içerik ve meta veriler ile bir DataPackage oluşturun:

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

Bir URL paylaştığınızda, SetWebLink yerine SetApplicationLink kullanın (veya derin bağlantılar için SetText). Hedef uygulamalar daha sonra zengin bağlantı önizlemeleri oluşturabilir ve gezintiyi düz metin olarak işlemek yerine doğru şekilde işleyebilir.

3. Paylaşım kullanıcı arabirimini gösterme

Bir düğme tıklaması veya menü komutundan SayfaYı Paylaş'ı tetikleyin:

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

PWA'lar için Paylaşım özelliğini uygulayın

PWA'lar W3C Web Paylaşımı API'sini kullanır. PWA'nızın Windows ile tümleştirmek için gerekli bildirim özelliklerine sahip olduğundan emin olun:

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

PWA JavaScript'inizde Web Paylaşımı API'sini kullanın:

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

Masaüstü uygulamaları için Paylaşımı uygulayın (WinUI 3, WPF, WinForms)

Masaüstü uygulamaları (paketlenmiş veya paketlenmemiş olsun) IDataTransferManagerInterop arabirim kullanarak Paylaşım Sayfası'na pencere başına erişim sağlar. Bu, WinUI 3, WPF ve WinForms uygulamaları için geçerlidir.

1. Birlikte çalışabilirlik arabirimini tanımlayın ve bir DataTransferManager edinin

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. Doldurun ve gösterin

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

Tam bir örnek için bkz. kaynağı paylaşma örneği WPF.

Kaynak tarafındaki olaylar

Kullanıcı Paylaş'ı açtıktan sonra neler olduğunu gözlemlemek için kaynak uygulamalarda bu olayları kullanın.

API Ateşlendiğinde Neden kullanmalı
DataTransferManager.DataRequested Kullanıcı bir paylaşım işlemi başlatır Derle ve ekle DataPackage
DataTransferManager.TargetApplicationChosen Kullanıcı bir hedef uygulama seçer Hedef seçimi için isteğe bağlı telemetri
DataPackage.ShareCompleted Paylaşım tamamlandı İsteğe bağlı başarı telemetrisi
DataPackage.ShareCanceled Kullanıcı paylaşımı iptal eder İsteğe bağlı iptal telemetrisi

Note

Bu örnekte, kısalık olması için UWP uygulamaları için geçerli olan GetForCurrentView kullanılır. Masaüstü uygulamalarında, daha önce gösterildiği gibi DataTransferManager aracılığıyla IDataTransferManagerInterop.GetForWindow öğesini alın, ardından aynı olayları bağlayın.

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 ve DataPackage.Destroyed öncelikli olarak Pano ve yapıştırma iş akışları içindir. Bunlar genellikle Kaynak paylaşma senaryoları için gerekli değildir.

Paylaşım için en iyi yöntemler

Kaynak tarafı davranışını tahmin edilebilir tutmak için bu denetim listesini kullanın.

Recommended Kaçın Neden önemlidir?
URL'ler için SetWebLink veya SetApplicationLink kullanın URL'ler için SetText kullanın Bağlantılar hedef uygulamalarda doğru şekilde işlenir ve yönlendirilir
Ayarla Title ve isteğe bağlı meta veri (Description, küçük resim) Meta veriler olmadan içerik gönderme Paylaşım kullanıcı arayüzünü daha anlaşılır hâle getirir ve hedef oluşturmayı iyileştirir
TargetApplicationChosen, ShareCompleted ve ShareCanceled'yi telemetriye ihtiyacınız varsa işleyin Bu sinyallerin kaynak uygulamalardan ShareOperation geldiğini varsayarsak Bunlar, paylaşım sonrası içgörü için kaynak tarafı sinyalleridir
Paylaşılan yüklerin seçili eylem için odaklanmış ve geçerli kalmasını sağlayın Varsayılan olarak ilgisiz veya aşırı büyük yükler gönderme Hataları azaltır ve paylaşım başarı oranını artırır