앱에서 콘텐츠 공유 - Windows 공유 통합

Windows 공유 시트는 사용자가 앱에서 다른 Windows 앱으로 콘텐츠를 보낼 수 있도록 하는 시스템 제공 UI입니다. 이 가이드에서는 패키지된 앱(MSIX), PWA(프로그레시브 Web Apps) 및 패키지되지 않은 Win32 앱에서 공유 계약을 구현하는 방법을 설명합니다.

섹션 발견할 수 있는 것들
공유 방법 선택 UWP, 데스크톱 또는 PWA 앱에 적합한 API 집합 선택
UWP 앱에 대한 공유 구현 DataTransferManager.GetForCurrentViewShowShareUI
PWA에 공유 구현 Web Share API 통합
데스크톱 앱에 대한 공유 구현 IDataTransferManagerInteropWinUI 3, WPF, WinForms에 대한 창별 공유
소스 측 이벤트 대상 선택, 완료 및 취소 관찰
공유 모범 사례 신뢰할 수 있는 소스 쪽 동작에 대한 권장 사항

공유 방법 선택

앱 유형 Approach API 세트
UWP 앱 DataTransferManager.GetForCurrentViewShowShareUI 사용 Windows.ApplicationModel.DataTransfer
데스크톱 앱(WinUI 3, WPF, WinForms) 창별 공유에 사용 IDataTransferManagerInterop (패키지 또는 패키지되지 않음) COM interop을 통한 Windows 런타임
PWA(프로그레시브 웹앱) Web Share API + Windows 통합 사용 W3C 웹 공유

UWP 앱에 대한 공유 구현

Important

DataTransferManager.GetForCurrentViewShowShareUI은 UWP 앱에서만 지원됩니다. 데스크톱 앱(WinUI 3, WPF 또는 WinForms - 패키지 또는 패키지되지 않음)은 IDataTransferManagerInterop에 표시된 패턴을 사용해야 합니다.

1. DataTransferManager 가져오기

페이지를 초기화할 때 DataTransferManager에 대한 참조를 가져옵니다:

using Windows.ApplicationModel.DataTransfer;

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

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

2. DataPackage 채우기

사용자가 공유를 시작하면(예: 공유 단추를 클릭) 콘텐츠 및 메타데이터를 사용하여 DataPackage 만듭니다.

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 */;
}

팁 (조언)

URL을 공유할 때는 SetWebLink 대신 SetApplicationLink를 사용하세요(딥 링크의 경우 SetText). 그런 다음 대상 앱은 서식 있는 링크 미리 보기를 생성하고 탐색을 일반 텍스트로 처리하는 대신 올바르게 처리할 수 있습니다.

3. 공유 UI 표시

단추 클릭 또는 메뉴 명령에서 시트 공유를 트리거합니다.

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(프로그레시브 Web Apps)에 대한 공유 구현

PWA는 W3C 웹 공유 API를 사용합니다. PWA에 Windows 통합하는 데 필요한 매니페스트 속성이 있는지 확인합니다.

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

PWA JavaScript에서 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);
      }
    }
  }
}

데스크톱 앱에 대한 공유 구현(WinUI 3, WPF, WinForms)

패키지 또는 패키지되지 않은 데스크톱 앱은 인터페이스를 IDataTransferManagerInterop 사용하여 창별로 공유 시트에 액세스합니다. WinUI 3, WPF 및 WinForms 앱에 적용됩니다.

1. interop 인터페이스를 선언하고 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. 채우기 및 표시

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

전체 예제는 WPF 공유 원본 샘플을 참조하세요.

원본 쪽 이벤트

원본 앱에서 이러한 이벤트를 사용하여 사용자가 공유를 연 후 발생한 작업을 관찰합니다.

API 실행 시 사용하는 이유
DataTransferManager.DataRequested 사용자가 공유 작업을 시작합니다. DataPackage를 빌드하고 연결합니다
DataTransferManager.TargetApplicationChosen 사용자가 대상 앱을 선택합니다. 대상 선택에 대한 선택적 원격 분석
DataPackage.ShareCompleted 공유가 완료됨 선택적 성공 관련 원격 분석
DataPackage.ShareCanceled 사용자가 공유를 취소합니다. 선택적 취소 관련 원격 분석

메모

이 예제에서는 UWP 앱에 적용되는 간결성을 사용합니다 GetForCurrentView . 데스크톱 앱에서는 앞서 설명한 대로 DataTransferManager를 통해 IDataTransferManagerInterop.GetForWindow를 획득한 다음, 동일한 이벤트를 연결합니다.

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

메모

DataPackage.OperationCompleted DataPackage.Destroyed 주로 클립보드 및 붙여넣기 워크플로용입니다. 일반적으로 공유 원본 시나리오에는 필요하지 않습니다.

공유 모범 사례

이 검사 목록을 사용하여 원본 쪽 동작을 예측 가능하게 유지합니다.

권장 피하기 중요한 이유
URL 사용 SetWebLink 또는 SetApplicationLink URL에는 SetText을(를) 사용하세요 링크가 대상 앱에서 올바르게 렌더링 및 라우팅됩니다
Title 및 선택적 메타데이터(Description, 썸네일) 설정 메타데이터 없이 콘텐츠 보내기 공유 UI 선명도 및 대상 렌더링 개선
원격 분석이 필요한 경우 TargetApplicationChosen, ShareCompleted, ShareCanceled를 처리하세요. 이러한 신호가 원본 앱의 ShareOperation에서 나온다고 가정하면 다음은 공유 후 인사이트를 위한 소스 쪽 신호입니다.
선택한 작업에 대해 공유 페이로드에 포커스가 있고 유효한 상태로 유지 기본적으로 관련 없는 페이로드 또는 대형 페이로드 보내기 실패를 줄이고 공유 성공률을 향상시킵니다.