Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit dem Windows-Freigabeblatt können Sie in Ihrer App Inhalte empfangen, die aus anderen Apps geteilt werden. In diesem Leitfaden wird erläutert, wie Sie Ihre App als Freigabeziel registrieren und gemeinsam genutzte Inhalte für verpackte Apps (MSIX), Progressive Web-Apps (PWAs) und entpackte Win32-Apps behandeln.
In diesem Artikel
| Abschnitt | Was Sie finden |
|---|---|
| Bevor Sie Funktionen deklarieren | Geben Sie nur die Dateitypen und -formate an, die Ihre App verarbeitet. |
| Freigabeziel für gepackte Apps (UWP und gepackte Desktop-Apps) implementieren | Manifestdeklaration und Aktivierungsbehandlung für UWP- und verpackte Desktop-Apps |
| Share Target für PWAs implementieren |
share_target Manifest- und POST-Verarbeitung |
| Freigaben in einer nicht gepackten Win32-App empfangen | Gewähren Sie eine Paketidentität und registrieren Sie sich als Freigabeziel |
| Bewährte Methoden | Empfehlungen für zuverlässige Empfangsabläufe |
| Empfangsfortschritt melden | Status für umfangreiche oder lang andauernde Freigaben |
| Problembehandlung | Beheben häufiger Probleme mit Share Target |
Bevor Sie Funktionen deklarieren
Die meisten Integrationsfehler bei Share Targets entstehen dadurch, dass mehr deklariert wird, als Ihre App tatsächlich verarbeiten kann. Wenn Ihre App <uap:SupportsAnyFileType /> deklariert, wird sie im Freigabefenster für jeden Dateityp angezeigt, einschließlich Dateien, die sie nicht verarbeiten kann (beispielsweise ein Bildbearbeitungsprogramm, das erscheint, wenn ein Benutzer eine Tabellenkalkulation freigibt).
Deklarieren Sie immer nur die spezifischen Dateitypen und Datenformate, die Ihre App verarbeiten kann. Beispiel:
<!-- ✓ Correct: declare only what you support -->
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.png</uap:FileType>
</uap:SupportedFileTypes>
<!-- ✗ Incorrect: declares everything -->
<!-- <uap:SupportsAnyFileType /> -->
Reservieren Sie <uap:SupportsAnyFileType /> nur für allgemeine Dateiverschiebungen (Cloudspeicher, Dateiübertragungs-Apps). Siehe DataFormat & FileType-Referenz für Deklarationen nach App-Kategorie.
Freigabeziel für gepackte Apps implementieren (UWP und gepackte Desktop-Apps)
Dieser Abschnitt bezieht sich auf UWP-Apps und verpackte Desktop-Apps (WinUI 3, WPF, WinForms). Beide werden als MSIX-Pakete mit Paketidentität ausgeliefert, sodass sie das Freigabeziel auf die gleiche Weise deklarieren und sich nur darin unterscheiden, wie sie die Aktivierung handhaben (siehe Schritt 2).
1. Deklarieren im Manifest
Bearbeiten Sie Ihr package.appxmanifest, um sich als Freigabeziel zu registrieren. Deklarieren Sie nur die Dateitypen und Datenformate, die Ihre App behandelt:
<Extensions>
<uap:Extension Category="windows.shareTarget">
<uap:ShareTarget>
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.jpeg</uap:FileType>
<uap:FileType>.png</uap:FileType>
<uap:FileType>.gif</uap:FileType>
<uap:FileType>.bmp</uap:FileType>
</uap:SupportedFileTypes>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
</Extensions>
2. Die Freigabeaktivierung verarbeiten
Wenn Ihre App als Freigabeziel aktiviert wird, verarbeiten Sie das OnShareTargetActivated-Ereignis:
Hinweis
OnShareTargetActivated ist die Aktivierungsüberschreibung für UWP-Apps (Windows.UI.Xaml.Application). Gepackte Desktop-Apps (WinUI 3, WPF, WinForms) erhalten die Freigabeaktivierung über AppInstance.GetActivatedEventArgs und prüfen auf ExtendedActivationKind.ShareTarget. Informationen zur Aktivierung für verpackte Apps finden Sie unter "Abrufen von Aktivierungsinformationen".
protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
ShareOperation shareOperation = args.ShareOperation;
shareOperation.ReportStarted();
try
{
if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
// Validate: check count, types, and sizes
if (items.Count == 0)
{
shareOperation.ReportError("No items received.");
return;
}
var file = (IStorageFile)items[0];
// Process the file
await ProcessImageAsync(file);
}
shareOperation.ReportCompleted();
}
catch (Exception ex)
{
shareOperation.ReportError($"Error: {ex.Message}");
}
}
private async Task ProcessImageAsync(IStorageFile file)
{
// Your processing logic here
}
Für verpackte Desktop-Apps (WinUI 3, WPF, WinForms), die mit dem Windows App SDK erstellt wurden, gibt es keine OnShareTargetActivated Überschreibung. Überprüfen Sie stattdessen die Aktivierung in Ihrer Methode Main und prüfen Sie auf ExtendedActivationKind.ShareTarget:
using Microsoft.Windows.AppLifecycle;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.DataTransfer;
[STAThread]
static void Main(string[] args)
{
AppActivationArguments activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
if (activatedArgs.Kind == ExtendedActivationKind.ShareTarget)
{
HandleShareAsync(activatedArgs.Data as ShareTargetActivatedEventArgs);
}
else
{
// Normal launch path
}
}
static async void HandleShareAsync(ShareTargetActivatedEventArgs args)
{
ShareOperation shareOperation = args.ShareOperation;
shareOperation.ReportStarted();
if (shareOperation.Data.Contains(StandardDataFormats.StorageItems))
{
IReadOnlyList<IStorageItem> items = await shareOperation.Data.GetStorageItemsAsync();
// Process the shared items.
}
shareOperation.ReportCompleted();
}
3. Auswählen der zu deklarierenden Datenformate
Verwenden Sie diesen Verweis, um zu entscheiden, was deklariert werden soll:
| Format | Wann verwenden? | Beispiel-Apps |
|---|---|---|
StorageItems |
Ihre App empfängt Dateien | Foto-Editoren, Dokumentleseprogramme |
Bitmap |
Ihre App empfängt Bilder | Bildanzeigen, Entwerfen von Apps |
Text |
Ihre App empfängt Nur-Text | Notizen-Apps, Text-Editoren |
Html |
Ihre App empfängt Rich-Text-Inhalte | E-Mail-Clients, umfangreiche Editoren |
Uri / WebLink |
Ihre App behandelt Links | Browser, Linkmanager |
Rtf |
Ihre App empfängt formatierten Text. | Word Prozessoren |
Weitere Informationen finden Sie unter DataFormat & FileType-Referenz.
Freigabeziel für Progressive Web-Apps (PWAs) implementieren
PWAs unter Windows registrieren sich über das Web-App-Manifest als Freigabeziel. Hinzufügen eines share_target Eintrags:
{
"name": "My PWA",
"short_name": "MyPWA",
"share_target": {
"action": "/share",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "media",
"accept": ["image/*", "video/*"]
}
]
}
}
}
Behandeln Sie in Ihrer /share Route die POST-Anforderung:
app.post('/share', async (req, res) => {
const { title, text, url, files } = req.body;
// Validate and process
if (files && files.length > 0) {
const file = files[0];
// Process the file
console.log('Received file:', file.originalname);
}
if (text) {
console.log('Received text:', text);
}
res.redirect('/');
});
Deklarieren Sie nur Dateitypen, die Ihre PWA verarbeiten kann. Deklarieren * Sie z. B. nicht als Accept-Typ, es sei denn, Ihre App verarbeitet wirklich alle Dateien.
Geteilte Inhalte in einer nicht paketierten Win32-App empfangen
Um sich als Share Target zu registrieren, benötigt Ihre App Paketidentität. Wenn Ihre Win32-App entpackt ist, weisen Sie ihr die Paketidentität auf eine von zwei Arten zu:
- Mit MSIX neu paketieren (bevorzugt): Verwenden Sie in Visual Studio die Vorlage Windows Application Packaging Project für eine saubere, vertrauenswürdige Installation. Weitere Informationen finden Sie unter "Einrichten Ihrer Desktopanwendung für MSIX-Verpackungen".
- Paket mit externem Speicherort (sparse package): Fügen Sie ein leeres MSIX-Paket hinzu, das die Identität, die Registrierung als Freigabeziel und visuelle Ressourcen enthält, während Ihr bestehender Installer weiterhin die App-Binärdateien verwaltet. Verwenden Sie dies nur, wenn Sie über ein Installationsprogramm verfügen, das Sie nicht zu MSIX verschieben können.
Der Rest dieses Abschnitts durchläuft den Ansatz für externe Speicherorte.
1. Erstellen des Paketmanifests
Erstellen Sie ein AppxManifest.xml, das <uap10:AllowExternalContent> festlegt, Identität und Funktionalitäten deklariert und das Ziel registriert. Halten Sie Publisher, PackageName und ApplicationId mit Ihrem .exe.manifest und Signaturzertifikat synchron.
<Identity Name="PhotoStoreDemo" ProcessorArchitecture="neutral" Publisher="CN=YourPubNameHere" Version="1.0.0.0" />
<Properties>
<uap10:AllowExternalContent>true</uap10:AllowExternalContent>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="unvirtualizedResources" />
</Capabilities>
<Applications>
<Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App">
<Extensions>
<uap:Extension Category="windows.shareTarget">
<uap:ShareTarget Description="Send to PhotoStoreDemo">
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.png</uap:FileType>
</uap:SupportedFileTypes>
<uap:DataFormat>StorageItems</uap:DataFormat>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
</Extensions>
</Application>
</Applications>
Fügen Sie ein Anwendungsmanifest (YourApp.exe.manifest) hinzu, das die ausführbare Datei mit der Paketidentität verknüpft:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="PhotoStoreDemo.app" />
<msix xmlns="urn:schemas-microsoft-com:msix.v1"
publisher="CN=YourPubNameHere"
packageName="PhotoStoreDemo"
applicationId="PhotoStoreDemo" />
</assembly>
2. Erstellen und Signieren des Pakets
Verwenden Sie MakeAppx.exe mit dem /nv-Schalter, um ein Paket zu erstellen, das nur das Manifest enthält, und signieren Sie es dann mit einem vertrauenswürdigen Zertifikat unter Verwendung von SignTool.exe:
MakeAppx.exe pack /d <folder with AppxManifest.xml> /p <output>\mypackage.msix /nv
SignTool.exe sign /fd SHA256 /a /f <path to cert> /p <cert key> <path to package>
Installieren Sie das Signaturzertifikat an einem vertrauenswürdigen Speicherort auf dem Computer.
3. Registrieren des Pakets bei der ersten Ausführung
Registrieren Sie beim ersten Start das Paket für externe Speicherorte, damit die App mit Identität neu gestartet wird. Geben Sie absolute Pfade zum externen Speicherort und zum signierten .msix an.
[STAThread]
public static void Main(string[] cmdArgs)
{
if (!ExecutionMode.IsRunningWithIdentity())
{
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
if (registerPackageWithExternalLocation(externalLocation, externalPkgPath))
{
// Registration succeeded - restart so the app runs with identity.
// Join the arguments into a single string; cmdArgs.ToString() would
// return the array type name ("System.String[]"), not the arguments.
string forwardedArgs = cmdArgs is null ? string.Empty : string.Join(" ", cmdArgs);
Process.Start(Application.ResourceAssembly.Location, arguments: forwardedArgs);
}
else
{
// Registration failed - run without identity.
new SingleInstanceManager().Run(cmdArgs);
}
}
}
4. Freigabeaktivierung verarbeiten
Nachdem die App mit der Identität neu gestartet wurde, verarbeiten Sie ExtendedActivationKind.ShareTarget wie in „Freigabeaktivierung verarbeiten“ gezeigt.
Vollständige Beispiele finden Sie im PhotoStoreDemo-Beispiel (verpackt mit externem Speicherort) und im WinUI-Freigabezielbeispiel.
Verwenden Sie IDataTransferManagerInterop für die quellseitige Desktopfreigabe wie in "Inhalt freigeben" aus Ihrer App beschrieben.
Bewährte Methoden
Verwenden Sie diese Checkliste beim Erstellen von Empfangsflüssen.
| Empfohlen | Vermeiden | Warum dies wichtig ist |
|---|---|---|
| Deklarieren nur bestimmter Dateierweiterungen und Datenformate | Deklarieren von <uap:SupportsAnyFileType /> für Apps, die keine Dateien verschieben |
Verhindert, dass irrelevante Ziele im Share Sheet angezeigt werden |
| Überprüfen von Format, Anzahl, Dateityp und Dateigröße vor der Verarbeitung | Vorausgesetzt, dass eingehende Daten immer den Erwartungen entsprechen | Verhindert Laufzeitfehler und fehlerhafte Freigabeerlebnisse |
Deklarieren Uri für Verknüpfungshandler und Bitmap + StorageItems für Bildhandler |
Teilweise Deklarationen für gängige Freigabe-Payloads | Stellt sicher, dass Ihre App für den Inhalt angezeigt wird, der tatsächlich unterstützt wird |
Verwenden Sie ReportStarted, ReportDataRetrieved und ReportCompleted in lang laufenden Empfangsabläufen |
Ausführung lang andauernder Empfangsvorgänge ohne Fortschrittsanzeige | Sorgt für einen zuverlässigen Freigabevorgang und versetzt das System in den korrekten Zustand |
Empfangsfortschritt melden (optional, aber empfohlen)
Bei großen Payloads oder längerer Verarbeitung melden Sie den Status vom Freigabeziel:
protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
ShareOperation shareOperation = args.ShareOperation;
shareOperation.ReportStarted();
try
{
// Acquire the data your app needs.
var items = await shareOperation.Data.GetStorageItemsAsync();
shareOperation.ReportDataRetrieved();
// Process data.
await ProcessAsync(items);
shareOperation.ReportCompleted();
}
catch (Exception ex)
{
shareOperation.ReportError($"Share failed: {ex.Message}");
}
}
Verwenden Sie ReportCompleted(QuickLink), wenn Sie einen QuickLink für zukünftige Freigaben zurückgeben möchten.
Troubleshooting
Meine App wird nicht im Freigabeblatt angezeigt:
- Überprüfen Sie, ob ihre Manifestdeklarationen dem freigegebenen Inhalt entsprechen (überprüfen Sie Dateitypen und Datenformate).
- Stellen Sie für verpackte Apps sicher, dass Sie die App mit Paketidentität ausführen.
- Überprüfen Sie die DataFormat- und FileType-Referenz für Ihre App-Kategorie.
Meine App wird bei Inhalten angezeigt, die sie nicht verarbeiten kann:
- Beschränken Sie Ihre
SupportedFileTypes- undDataFormat-Listen auf die von Ihnen unterstützten Einträge.
Das Freigabefenster wird mit einem Fehler geschlossen:
- Stellen Sie sicher, dass Sie
ReportStarted()vor allen asynchronen Arbeiten undReportCompleted()nach Abschluss aufrufen. - Behandeln Sie Ausnahmen und rufen Sie
ReportError()mit einer aussagekräftigen Meldung auf.
Ich erhalte die Datei, die ich erwartet, nicht:
- Überprüfen Sie, ob das Dateiformat mit einem deklarierten
FileTypeoderDataFormatübereinstimmt. - Implementieren Sie in Ihrem Aktivierungshandler eine Validierungslogik, um zu überprüfen, was tatsächlich eingeht.
Verwandte Inhalte
Windows developer