Inhoud ontvangen in uw app - Windows Delen integreren

Met het Windows Share Sheet kunt u inhoud ontvangen (gedeeld vanuit andere apps) via uw app. In deze handleiding wordt uitgelegd hoe u uw app registreert als sharedoel en gedeelde inhoud verwerkt in verpakte apps (MSIX), Progressive Web Apps (PWA's) en uitgepakte Win32-apps.

In dit artikel

Afdeling Wat u zult vinden
Voordat u mogelijkheden declareert Geef alleen de bestandstypen en bestandsindelingen op die uw app verwerkt
Share Target implementeren voor verpakte apps (UWP en verpakte desktop) Manifestdeclaratie en activeringsafhandeling voor UWP en verpakte desktop-apps
Sharedoel implementeren voor PWA's share_target manifest- en POST-verwerking
Gedeelde inhoud ontvangen in een niet-verpakte Win32-app Pakketidentiteit toekennen en registreren als deeldoel
Beste praktijken Aanbevelingen voor betrouwbare ontvangststromen
Voortgang van rapport ontvangen Statusrapportage voor grote of langlopende shares
Troubleshooting Oplossingen voor veelvoorkomende problemen met Share Target

Voordat u mogelijkheden declareert

De meeste integratiefouten met share-targets ontstaan door meer op te geven dan je app daadwerkelijk kan verwerken. Als uw app declareert <uap:SupportsAnyFileType />, wordt deze weergegeven in het shareblad voor elk bestandstype, inclusief bestanden die niet kunnen worden verwerkt (bijvoorbeeld een foto-editor die wordt weergegeven wanneer een gebruiker een spreadsheet deelt).

Declareer altijd alleen de specifieke bestandstypen en gegevensindelingen die uw app kan verwerken. Voorbeeld:

<!-- ✓ 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 /> -->

Reserveer <uap:SupportsAnyFileType /> alleen voor algemene apps voor bestandsverplaatsing (cloudopslag, apps voor bestandsoverdracht). Zie naslaginformatie voor DataFormat & FileType voor declaraties per app-categorie.

Share Target implementeren voor verpakte apps (UWP en verpakte desktop)

Deze sectie is van toepassing op UWP-apps en verpakte bureaublad-apps (WinUI 3, WPF, WinForms). Beide verzenden als MSIX-pakketten met pakketidentiteit, zodat ze het Share-doel op dezelfde manier declareren en alleen verschillen in de manier waarop ze activering verwerken (weergegeven in stap 2).

1. Declareren in het manifest

Bewerk uw package.appxmanifest om deze als Share Target te registreren. Declareer alleen de bestandstypen en gegevensindelingen die uw app verwerkt:

<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. De activering van de share afhandelen

Wanneer uw app is geactiveerd als een sharedoel, moet u de OnShareTargetActivated gebeurtenis afhandelen:

Note

OnShareTargetActivated is de activeringsoverschrijving voor UWP-apps (Windows.UI.Xaml.Application). Verpakte bureaublad-apps (WinUI 3, WPF, WinForms) ontvangen deelactivering via AppInstance.GetActivatedEventArgs en controleren op de aanwezigheid van ExtendedActivationKind.ShareTarget. Zie Activeringsgegevens ophalen voor verpakte apps.

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
}

Voor verpakte bureaublad-apps (WinUI 3, WPF, WinForms) gebouwd met de Windows App SDK, is er geen OnShareTargetActivated overschrijving. Controleer in plaats daarvan de activering in uw Main methode en controleer op 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. Kies welke gegevensindelingen u wilt declareren

Gebruik deze verwijzing om te bepalen wat u wilt declareren:

Format Wanneer gebruiken Voorbeeld-apps
StorageItems Uw app ontvangt bestanden Fotobewerkers, documentlezers
Bitmap Uw app ontvangt afbeeldingen Afbeeldingsviewers, ontwerp-apps
Text Uw app ontvangt tekst zonder opmaak Notitie-apps, teksteditors
Html Uw app ontvangt inhoud met tekst met opmaak E-mailclients, uitgebreide editors
Uri / WebLink Uw app verwerkt koppelingen Browsers, koppelingsmanagers
Rtf Uw app ontvangt opgemaakte tekst Tekstverwerkers

Zie de naslaginformatie over DataFormat & FileType voor meer informatie.

Sharedoel implementeren voor progressive Web Apps (PWA's)

PWA’s op Windows registreren zich via het webappmanifest als Share Target. Voeg een share_target vermelding toe:

{
  "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/*"]
        }
      ]
    }
  }
}

Verwerk in je /share-route het POST-verzoek:

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

Declareer alleen bestandstypen die uw PWA kan verwerken. Declareer * bijvoorbeeld niet als een accepttype, tenzij uw app echt alle bestanden verwerkt.

Gedeelde inhoud ontvangen in een niet-verpakte Win32-app

Als u uw app wilt registreren als doel voor delen, moet uw app een pakket-id hebben. Als uw Win32-app is uitgepakt, verleent u deze pakketidentiteit op twee manieren:

  • Opnieuw verpakken met MSIX (voorkeur): gebruik de sjabloon Windows Application Packaging Project in Visual Studio voor een schone, vertrouwde installatie. Zie Uw bureaubladtoepassing instellen voor MSIX-pakketten.
  • Pakket met een externe locatie (sparse-pakket): voeg een leeg MSIX-pakket toe dat identiteit, de registratie als deeldoel en visuele elementen bevat, terwijl uw bestaande installatieprogramma de binaire bestanden van de app blijft beheren. Gebruik dit alleen als u een installatieprogramma hebt dat u niet kunt verplaatsen naar MSIX.

In de rest van deze sectie wordt de externe locatiebenadering beschreven.

1. Ontwerp het pakketmanifest

Maak een AppxManifest.xml dat <uap10:AllowExternalContent> instelt, de identiteit en mogelijkheden definieert en het sharedoel registreert. Houd Publisher, PackageName en ApplicationId gesynchroniseerd met uw .exe.manifest en ondertekeningscertificaat.

<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>

Voeg een toepassingsmanifest (YourApp.exe.manifest) toe dat het uitvoerbare bestand koppelt aan de pakketidentiteit:

<?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. Het pakket maken en ondertekenen

Gebruik MakeAppx.exe met de /nv switch om een pakket te bouwen dat alleen het manifest bevat en onderteken het vervolgens met een vertrouwd certificaat met behulp van 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>

Installeer het handtekeningcertificaat op een vertrouwde locatie op de computer.

3. Registreer het pakket bij de eerste uitvoering

Registreer bij de eerste keer opstarten het pakket voor externe locatie, zodat de app opnieuw wordt gestart met een identiteit. Geef absolute paden op naar de externe locatie en de ondertekende .msix.

[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. Activering van share afhandelen

Nadat de app opnieuw is opgestart met identiteitsgegevens, verwerkt u ExtendedActivationKind.ShareTarget zoals beschreven in De activering voor Delen afhandelen.

Zie het PhotoStoreDemo-voorbeeld (verpakt met externe locatie) en het WinUI Share Target-voorbeeld voor volledige voorbeelden.

Gebruik IDataTransferManagerInterop voor het delen van bureaublad aan de bronzijde, zoals beschreven in Inhoud delen vanuit uw app.

Beste praktijken

Gebruik deze checklist bij het bouwen van ontvangststromen.

Aanbevolen Vermijd Waarom het belangrijk is
Alleen specifieke bestandsextensies en gegevensindelingen declareren Opgeven van <uap:SupportsAnyFileType /> voor apps die geen bestanden verplaatsen Voorkomt irrelevante doeluitingen in Share Sheet
Indeling, aantal, bestandstype en bestandsgrootte valideren voordat deze wordt verwerkt Ervan uitgaande dat binnenkomende gegevens altijd overeenkomen met verwachtingen Voorkomt runtimefouten en verbroken ervaringen met delen
Declareren Uri voor koppelingshandlers en Bitmap + StorageItems voor afbeeldingshandlers Gedeeltelijke declaraties voor gemeenschappelijke gedeelde payloads Zorgt ervoor dat uw app wordt weergegeven voor de inhoud die daadwerkelijk wordt ondersteund
Gebruik ReportStarted, ReportDataRetrieved en ReportCompleted in langlopende ontvangststromen Langlopend ontvangen werk uitvoeren zonder voortgangsrapportage Houdt de sharebewerking betrouwbaar en geeft het systeem de juiste status

Voor grote payloads of bij langere verwerking: status rapporteren vanuit de share target:

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

Gebruik ReportCompleted(QuickLink) wanneer u een QuickLink voor toekomstig delen wilt teruggeven.

Troubleshooting

Mijn app wordt niet weergegeven in het shareblad:

  • Controleer of uw manifestdeclaraties overeenkomen met de inhoud die wordt gedeeld (controleer de bestandstypen en gegevensindelingen).
  • Voor verpakte apps moet u ervoor zorgen dat u de app uitvoert met pakketidentiteit.
  • Controleer de naslaginformatie voor DataFormat & FileType voor uw app-categorie.

Mijn app verschijnt bij inhoud die de app niet aankan:

  • Verfijn uw SupportedFileTypes en DataFormat lijsten tot alleen wat u ondersteunt.

Het Share Sheet wordt gesloten vanwege een fout:

  • Zorg ervoor dat u belt ReportStarted() vóór asynchroon werk en ReportCompleted() wanneer u klaar bent.
  • Verwerk uitzonderingen en roep ReportError() aan met een beschrijvend bericht.

Ik ontvang niet het bestand dat ik verwachtte:

  • Controleer of de bestandsindeling overeenkomt met een gedeclareerde FileType of DataFormat.
  • Voeg validatielogica toe aan uw activeringshandler om te controleren wat er daadwerkelijk binnenkomt.