Přijímání obsahu v aplikaci – integrace sdílení ve Windows

List pro sdílení Windows umožňuje přijímat obsah (sdílený z jiných aplikací) prostřednictvím vaší aplikace. Tento průvodce vysvětluje, jak zaregistrovat aplikaci jako cíl sdílení a pracovat se sdíleným obsahem v rámci zabalených aplikací (MSIX), progresivních webových aplikací (PWA) a nebalených aplikací Win32.

Oddíl Co najdete
Před deklarování možností Deklarujte pouze typy souborů a formáty, které vaše aplikace zpracovává.
Implementujte cíl sdílení pro balíčkované aplikace (UWP a balíčkované desktopové aplikace) Deklarace manifestu a zpracování aktivace pro UPW a zabalené desktopové aplikace
Implementujte cíl sdílení pro PWA share_target zpracování manifestu a POST
Přijímání sdíleného obsahu v nebalené aplikaci Win32 Přidělit identitu balíčku a zaregistrovat jako cíl sdílení
Osvědčené postupy Doporučení pro spolehlivé příchozí toky
Průběh příjmu hlášení Hlášení stavu pro rozsáhlá nebo dlouhotrvající sdílení
Troubleshooting Opravy běžných problémů se službou Share Target

Před deklarování možností

Většina chyb při integraci cíle sdílení vzniká kvůli tomu, že deklarujete více, než vaše aplikace skutečně dokáže zpracovat. Pokud vaše aplikace deklaruje <uap:SupportsAnyFileType />, zobrazí se v seznamu Sdílet pro každý typ souboru, včetně souborů, které nemůže zpracovat (například editor fotek, který se zobrazí, když uživatel sdílí tabulku).

Vždy deklarujte pouze konkrétní typy souborů a formáty dat, které vaše aplikace dokáže zpracovat. Příklad:

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

Rezervovat <uap:SupportsAnyFileType /> pouze pro přesuny souborů pro obecné účely (cloudové úložiště, aplikace pro přenos souborů). Viz Referenční informace k deklaracím podle kategorie aplikace v části DataFormat &FileType .

Implementujte cíl sdílení pro aplikace v balíčku (UWP a desktopové aplikace v balíčku)

Tato část se týká aplikací pro UPW a zabalených desktopových aplikací (WinUI 3, WPF (Windows Presentation Foundation), WinForms). Obě se dodávají jako balíčky MSIX s identitou balíčku, takže deklarují cíl sdílené složky stejným způsobem a liší se pouze v tom, jak zpracovávají aktivaci (viz krok 2).

1. Deklarace v manifestu

Upravte svůj package.appxmanifest, aby se zaregistroval jako cíl sdílení. Deklarujte pouze typy souborů a datové formáty, které vaše aplikace zpracovává:

<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. Zpracujte aktivaci funkce Share

Když je vaše aplikace aktivována jako cíl pro sdílení, zpracujte událost OnShareTargetActivated:

Note

OnShareTargetActivated je přepsání aktivace pro aplikace UWP (Windows.UI.Xaml.Application). Zabalené desktopové aplikace (WinUI 3, WPF (Windows Presentation Foundation), WinForms) přijímají aktivaci sdílení prostřednictvím AppInstance.GetActivatedEventArgs a kontrolují přítomnost ExtendedActivationKind.ShareTarget. Viz Získání informací o aktivaci pro zabalené aplikace.

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
}

U zabalených desktopových aplikací (WinUI 3, WPF (Windows Presentation Foundation), WinForms) vytvořených pomocí Windows App SDK neexistuje žádné OnShareTargetActivated přepsání. Místo toho ověřte aktivaci v metodě Main a zkontrolujte 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. Zvolte formáty dat, které chcete deklarovat.

Pomocí tohoto odkazu se můžete rozhodnout, co chcete deklarovat:

Format Kdy ho použít Ukázkové aplikace
StorageItems Vaše aplikace přijímá soubory Editory fotek, čtenáři dokumentů
Bitmap Vaše aplikace přijímá obrázky Čtenáři obrázků, návrh aplikací
Text Aplikace obdrží prostý text. Aplikace pro poznámky, textové editory
Html Aplikace přijímá obsah ve formátu RTF Poštovní klienti, editory formátovaného textu
Uri / WebLink Vaše aplikace zpracovává odkazy Prohlížeče, správci odkazů
Rtf Aplikace obdrží formátovaný text. procesory Word

Další podrobnosti naleznete v tématu DataFormat &FileType reference.

Implementujte cíl sdílení pro progresivní webové aplikace (PWA)

PWA se ve Windows zaregistrují jako cíl sdílení pomocí manifestu webové aplikace. share_target Přidejte položku:

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

Ve své /share cestě zpracujte požadavek metodou POST:

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

Deklarujte pouze typy souborů, které může aplikace PWA zpracovat. Například nehlásíte * jako typ přijetí, pokud vaše aplikace skutečně nezpracuje všechny soubory.

Přijímání sdíleného obsahu v nezabalené aplikaci Win32

Aby se vaše aplikace zaregistrovala jako cíl pro sdílení, potřebuje identitu balíčku. Pokud je vaše aplikace Win32 rozbalená, udělte jí identitu balíčku jedním ze dvou způsobů:

  • Opětovné zabalení pomocí MSIX (upřednostňované): Použijte šablonu Windows Application Packaging Project v Visual Studio pro čistou důvěryhodnou instalaci. Viz Nastavení desktopové aplikace pro balení MSIX.
  • Balíček s externím umístěním (řídký balíček): přidejte prázdný balíček MSIX, který obsahuje identitu, registraci cíle sdílení a vizuální prvky, zatímco váš stávající instalační program nadále spravuje binární soubory aplikace. Tuto možnost použijte jenom v případě, že máte instalační program, který nemůžete přesunout do MSIX.

Ve zbývající části této sekce vás provedeme přístupem s externím umístěním.

1. Vytvoření manifestu balíčku

Vytvořte AppxManifest.xml, který nastaví <uap10:AllowExternalContent>, deklaruje identitu a schopnosti a zaregistruje cíl sdílení. Udržujte Publisher, PackageName a ApplicationId synchronizované s vaším .exe.manifest a certifikátem pro podepisování.

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

Přidejte manifest aplikace (YourApp.exe.manifest), který propojí spustitelný soubor s identitou balíčku:

<?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. Vytvoření a podepsání balíčku

Pomocí MakeAppx.exe přepínače sestavte balíček, který obsahuje pouze manifest, a pak ho podepište důvěryhodným certifikátem pomocí/nv: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>

Nainstalujte podpisový certifikát do důvěryhodného umístění na počítači.

3. Registrace balíčku při prvním spuštění

Při prvním spuštění zaregistrujte balíček external-location, aby se aplikace restartovala s identitou. Zadejte absolutní cesty k externímu umístění a také podepsaný .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. Zpracovat aktivaci sdílení

Jakmile se aplikace restartuje s ověřenou identitou, zpracujte ExtendedActivationKind.ShareTarget , jak je znázorněno v části Zpracování aktivačního požadavku sdílení.

Kompletní příklady najdete v ukázce PhotoStoreDemo (zabalenou s externím umístěním) a v ukázce cíle sdílení WinUI.

Pro sdílení plochy na straně zdroje použijte IDataTransferManagerInterop , jak je popsáno v části Sdílení obsahu z vaší aplikace.

Osvědčené postupy

Tento kontrolní seznam použijte při vytváření příchozích toků.

Doporučený Vyhněte se Proč je to důležité
Deklarace pouze konkrétních přípon souborů a datových formátů Deklarace <uap:SupportsAnyFileType /> pro aplikace, které nepřesouvají soubory Zabraňuje zobrazování nerelevantních cílů v nabídce Sdílet.
Před zpracováním ověřte formát, počet, typ souboru a velikost souboru. Za předpokladu, že příchozí data vždy odpovídají očekáváním Zabraňuje selháním za běhu a problémům při sdílení
Deklarujte Uri pro obslužné rutiny odkazů a Bitmap + StorageItems pro obslužné rutiny obrázků Částečné deklarace pro společné datové části sdílené složky Zajišťuje, aby se vaše aplikace zobrazila pro obsah, který skutečně podporuje.
Použití ReportStarted, ReportDataRetrieveda ReportCompleted v dlouhotrvajících tocích příjmu Provádění dlouhotrvajících operací příjmu bez hlášení průběhu Zajišťuje spolehlivost operací sdílení a poskytuje správný stav systému.

U velkých datových částí nebo delšího zpracování nahlašte stav ze cíle sdílené složky:

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

Použijte ReportCompleted(QuickLink), když chcete získat QuickLink pro budoucí sdílení.

Troubleshooting

Moje aplikace se nezobrazuje na share sheetu:

  • Ověřte, že deklarace manifestu odpovídají sdílenému obsahu (zkontrolujte typy souborů a formáty dat).
  • U zabalených aplikací se ujistěte, že používáte aplikaci s identitou balíčku.
  • Projděte si referenční informace k typu DataFormat &FileType pro vaši kategorii aplikace.

Moje aplikace se zobrazí pro obsah, který nemůže zpracovat:

  • Omezte své seznamy SupportedFileTypes a DataFormat pouze na to, co podporujete.

Panel sdílení se zavře s chybou:

  • Ujistěte se, že voláte ReportStarted() před jakoukoli asynchronní prací a ReportCompleted() po dokončení.
  • Zpracujte výjimky a zavolejte ReportError() s popisnou zprávou.

Nedostávám soubor, který očekávám:

  • Zkontrolujte, zda formát souboru odpovídá deklarovanému FileType formátu nebo DataFormat.
  • Přidejte do obslužné rutiny aktivace logiku ověření, abyste zkontrolovali, co skutečně přichází.