Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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. |
Hlásit průběh příjmu (volitelné, ale doporučené)
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
SupportedFileTypesaDataFormatpouze na to, co podporujete.
Panel sdílení se zavře s chybou:
- Ujistěte se, že voláte
ReportStarted()před jakoukoli asynchronní prací aReportCompleted()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
FileTypeformátu neboDataFormat. - Přidejte do obslužné rutiny aktivace logiku ověření, abyste zkontrolovali, co skutečně přichází.
Související obsah
Windows developer