Inhalte in Ihrer App empfangen – Windows-Freigabe integrieren

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

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- und DataFormat-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 und ReportCompleted() 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 FileType oder DataFormat übereinstimmt.
  • Implementieren Sie in Ihrem Aktivierungshandler eine Validierungslogik, um zu überprüfen, was tatsächlich eingeht.