Windows 공유 시트는 사용자가 앱에서 다른 Windows 앱으로 콘텐츠를 보낼 수 있도록 하는 시스템 제공 UI입니다. 이 가이드에서는 패키지된 앱(MSIX), PWA(프로그레시브 Web Apps) 및 패키지되지 않은 Win32 앱에서 공유 계약을 구현하는 방법을 설명합니다.
| 섹션 | 발견할 수 있는 것들 |
|---|---|
| 공유 방법 선택 | UWP, 데스크톱 또는 PWA 앱에 적합한 API 집합 선택 |
| UWP 앱에 대한 공유 구현 |
DataTransferManager.GetForCurrentView 및 ShowShareUI |
| PWA에 공유 구현 | Web Share API 통합 |
| 데스크톱 앱에 대한 공유 구현 |
IDataTransferManagerInteropWinUI 3, WPF, WinForms에 대한 창별 공유 |
| 소스 측 이벤트 | 대상 선택, 완료 및 취소 관찰 |
| 공유 모범 사례 | 신뢰할 수 있는 소스 쪽 동작에 대한 권장 사항 |
공유 방법 선택
| 앱 유형 | Approach | API 세트 |
|---|---|---|
| UWP 앱 |
DataTransferManager.GetForCurrentView 및 ShowShareUI 사용 |
Windows.ApplicationModel.DataTransfer |
| 데스크톱 앱(WinUI 3, WPF, WinForms) | 창별 공유에 사용 IDataTransferManagerInterop (패키지 또는 패키지되지 않음) |
COM interop을 통한 Windows 런타임 |
| PWA(프로그레시브 웹앱) | Web Share API + Windows 통합 사용 | W3C 웹 공유 |
UWP 앱에 대한 공유 구현
Important
DataTransferManager.GetForCurrentView 및 ShowShareUI은 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에서 나온다고 가정하면 |
다음은 공유 후 인사이트를 위한 소스 쪽 신호입니다. |
| 선택한 작업에 대해 공유 페이로드에 포커스가 있고 유효한 상태로 유지 | 기본적으로 관련 없는 페이로드 또는 대형 페이로드 보내기 | 실패를 줄이고 공유 성공률을 향상시킵니다. |
관련 콘텐츠
Windows developer