Ta emot innehåll i din app – integrera Windows Share

Med Windows Share Sheet kan du ta emot innehåll (delas från andra appar) via din app. Den här guiden förklarar hur du registrerar din app som ett Share Target och hanterar delat innehåll i paketerade appar (MSIX), Progressive Web Apps (PWA) och opaketerade Win32-appar.

I den här artikeln

Avsnitt Det här hittar du
Innan du deklarerar funktioner Deklarera endast filtyper och format som din app hanterar
Implementera Share Target för paketerade appar (UWP och paketerat skrivbord) Manifestdeklaration och aktiveringshantering för UWP och paketerade skrivbordsappar
Implementera delningsmål för PWA:er share_target manifest- och POST-hantering
Ta emot delningar i en opaketerad Win32-app Ge paketet ett paket-ID och registrera det som ett delningsmål
Bästa praxis Rekommendationer för tillförlitliga mottagningsflöden
Rapportera mottagningsförlopp Statusrapportering för stora eller långvariga delningar
Troubleshooting Korrigeringar för vanliga share target-problem

Innan du deklarerar funktioner

De flesta buggar i share-target-integrationen kommer från att deklarera mer än vad din app faktiskt kan hantera. Om appen deklarerar <uap:SupportsAnyFileType />visas den i resursbladet för varje filtyp, inklusive filer som den inte kan bearbeta (till exempel visas en fotoredigerare när en användare delar ett kalkylblad).

Deklarera alltid endast de specifika filtyper och dataformat som din app kan hantera. Ett exempel:

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

Använd <uap:SupportsAnyFileType /> endast för appar för allmän filflytt (molnlagring, filöverföringsappar). Se Referens för DataFormat och FileType för deklarationer efter appkategori.

Implementera Share Target för paketerade appar (UWP och paketerat skrivbord)

Det här avsnittet gäller UWP-appar och paketerade skrivbordsappar (WinUI 3, WPF, WinForms). Båda levereras som MSIX-paket med paketidentitet, så de deklarerar Share Target på samma sätt och skiljer sig bara åt i hur de hanterar aktivering (visas i steg 2).

1. Deklarera i manifestet

Redigera din package.appxmanifest så att den registreras som ett delningsmål. Deklarera endast de filtyper och dataformat som appen hanterar:

<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. Hantera resursaktiveringen

När din app aktiveras som ett delningsmål hanterar du händelsen OnShareTargetActivated:

Anmärkning

OnShareTargetActivated är aktiverings åsidosättningen för UWP-appar (Windows.UI.Xaml.Application). Paketerade skrivbordsappar (WinUI 3, WPF, WinForms) får delningsaktivering via AppInstance.GetActivatedEventArgs och söker efter ExtendedActivationKind.ShareTarget. Se Hämta aktiveringsinformation för paketerade appar.

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 paketerade skrivbordsappar (WinUI 3, WPF, WinForms) som har byggts med Windows App SDK finns det inget OnShareTargetActivated-åsidosättande. Granska i stället aktiveringen i din Main metod och sök efter 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. Välj vilka dataformat som ska deklareras

Använd den här referensen för att bestämma vad som ska deklareras:

Format När det bör användas Exempelappar
StorageItems Din app tar emot filer Fotoredigerare, dokumentläsare
Bitmap Appen tar emot bilder Bildvisningsprogram, designappar
Text Appen tar emot oformaterad text Anteckningsappar, textredigerare
Html Din app tar emot rtf-innehåll E-postklienter, RTF-redigerare
Uri / WebLink Din app hanterar länkar Webbläsare, länkhanterare
Rtf Appen får formaterad text Ordbehandlare

Mer information finns i Referens för DataFormat & FileType.

Implementera delningsmål för progressiva webbappar (PWA)

PWA:er på Windows registreras som ett delningsmål genom webbappmanifestet. Lägg till en share_target-post:

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

I din /share-rutt hanterar du POST-begäran:

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

Deklarera endast filtyper som PWA kan hantera. Deklarera till exempel inte * som en accepttyp om inte appen verkligen hanterar alla filer.

Ta emot delningar i en opaketerad Win32-app

Om du vill registrera dig som share target behöver din app paketidentitet. Om din Win32-app är opaketerad ger du den paketidentitet på ett av två sätt:

  • Paketera om med MSIX (rekommenderas): Använd mallen Windows Application Packaging Project i Visual Studio för en ren och betrodd installation. Se Konfigurera ditt skrivbordsprogram för MSIX-paketering.
  • Paket med extern plats (sparse-paket): lägg till ett tomt MSIX-paket som innehåller identitet, registrering av delningsmål och visuella resurser, medan ditt befintliga installationsprogram fortsätter att hantera appens binärfiler. Använd endast detta när du har ett installationsprogram som du inte kan flytta till MSIX.

Resten av detta avsnitt beskriver metoden med externa platser.

1. Redigera paketmanifestet

Skapa en AppxManifest.xml som anger <uap10:AllowExternalContent>, deklarerar identitet och kapaciteter och registrerar delningsmålet. Håll Publisher, PackageName och ApplicationId synkroniserade med ditt .exe.manifest och signeringscertifikat.

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

Lägg till ett programmanifest (YourApp.exe.manifest) som länkar den körbara filen till paketidentiteten:

<?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. Skapa och signera paketet

Använd MakeAppx.exe med växeln /nv för att skapa ett paket som bara innehåller manifestet och signera det sedan med ett betrott certifikat med hjälp av 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>

Installera signeringscertifikatet på en betrodd plats på datorn.

3. Registrera paketet vid första körningen

Vid första körningen registrerar du paketet ”external-location” så att appen startas om med en identitet. Ange absoluta sökvägar till den externa platsen och den signerade .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. Hantera delningsaktivering

När appen har startats om med identitet hanterar ExtendedActivationKind.ShareTarget du enligt beskrivningen i Hantera delningsaktiveringen.

Fullständiga exempel finns i PhotoStoreDemo-exemplet (paketerat med extern plats) och WinUI Share Target-exemplet.

För skrivbordsdelning på källsidan använder IDataTransferManagerInterop du enligt beskrivningen i Dela innehåll från din app.

Bästa praxis

Använd den här checklistan när du skapar mottagningsflöden.

Rekommenderad Undvik Varför det spelar roll
Deklarera endast specifika filnamnstillägg och dataformat Deklarera <uap:SupportsAnyFileType /> för appar som inte flyttar filer Förhindrar att irrelevanta mål visas i delningsbladet
Verifiera format, antal, filtyp och filstorlek före bearbetning Förutsatt att inkommande data alltid matchar förväntningarna Förhindrar körningsfel och problem vid delning
Deklarera Uri för länkhanterare och Bitmap + StorageItems för bildhanterare Partiella deklarationer för gemensamma delningsnyttolaster Ser till att din app visas för det innehåll som den faktiskt stöder
Använd ReportStarted, ReportDataRetrievedoch ReportCompleted i långvariga mottagningsflöden Utföra tidskrävande mottagningsarbete utan förloppsrapportering Håller delningsåtgärden tillförlitlig och ser till att systemet har korrekt tillstånd

För stora nyttolaster eller längre bearbetning, rapportera status från delningsmålet:

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

Använd ReportCompleted(QuickLink) när du vill returnera en QuickLink för framtida delningar.

Troubleshooting

Min app visas inte i resursbladet:

  • Kontrollera att manifestdeklarationerna matchar innehållet som delas (kontrollera filtyper och dataformat).
  • För paketerade appar kontrollerar du att du kör appen med paketidentitet.
  • Kontrollera referensen för DataFormat och FileType för din appkategori.

Min app visas för innehåll som den inte kan hantera:

  • Begränsa dina SupportedFileTypes listor och DataFormat till endast det du stöder.

Delningspanelen stängs med ett felmeddelande:

  • Se till att du anropar ReportStarted() före något asynkront arbete och ReportCompleted() när du är klar.
  • Hantera undantag och anropa ReportError() med ett beskrivande meddelande.

Jag får inte filen jag förväntar mig:

  • Kontrollera att filformatet matchar en deklarerad FileType eller DataFormat.
  • Lägg till valideringslogik i aktiveringshanteraren för att kontrollera vad som faktiskt kommer.