Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Windows Planilha de Compartilhamento permite que você receba conteúdo (compartilhado de outros aplicativos) por meio de seu aplicativo. Este guia explica como registrar seu aplicativo como um Destino de Compartilhamento e lidar com conteúdo compartilhado em aplicativos empacotados (MSIX), PWAs (Progressive Aplicativos Web) e aplicativos Win32 descompactados.
Neste artigo
| Seção | O que você encontrará |
|---|---|
| Antes de declarar recursos | Declarar somente os tipos de arquivo e os formatos que seu aplicativo manipula |
| Implementar destino de compartilhamento para aplicativos empacotados (UWP e desktop empacotado) | Declaração de manifesto e identificação de ativação para UWP e aplicativos desktop empacotados |
| Implementar destino de compartilhamento para PWAs |
share_target manifesto e identificação POST |
| Receber conteúdo compartilhado em um aplicativo Win32 não empacotado | Atribuir identidade de pacote e registrar como destino de compartilhamento |
| Práticas recomendadas | Recomendações para fluxos de recebimento confiáveis |
| Progresso de recebimento do relatório | Relatórios de status para compartilhamentos grandes ou de execução longa |
| Solução de problemas | Correções para os problemas comuns do Share Target |
Antes de declarar capacidades
A maioria dos bugs de integração com o destino de compartilhamento decorre de declarar mais do que seu aplicativo realmente consegue processar. Se seu aplicativo for declarado <uap:SupportsAnyFileType />, ele aparecerá na Planilha de Compartilhamento para cada tipo de arquivo, incluindo arquivos que ele não pode processar (por exemplo, um editor de fotos aparecendo quando um usuário compartilha uma planilha).
Sempre declare apenas os tipos de arquivo específicos e os formatos de dados que seu aplicativo pode manipular. Por exemplo:
<!-- ✓ 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 /> -->
Reserve <uap:SupportsAnyFileType /> somente para mover arquivos de uso geral (armazenamento em nuvem, aplicativos de transferência de arquivos). Consulte a referência DataFormat &FileType para declarações por categoria de aplicativo.
Implementar destino de compartilhamento para aplicativos empacotados (UWP e desktop empacotado)
Esta seção se aplica a aplicativos UWP e aplicativos de área de trabalho empacotados (WinUI 3, WPF, WinForms). Ambos são enviados como pacotes MSIX com identidade de pacote, portanto, declaram o Destino de Compartilhamento da mesma maneira e diferem apenas na forma como lidam com a ativação (mostrada na etapa 2).
1. Declarar no manifesto
Edite seu package.appxmanifest para registrá-lo como um alvo de compartilhamento. Declare apenas os tipos de arquivo e os formatos de dados que seu aplicativo manipula:
<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. Manipular a ativação de compartilhamento
Quando seu aplicativo for ativado como um destino de compartilhamento, manipule o evento OnShareTargetActivated:
Note
OnShareTargetActivated é a substituição de ativação para aplicativos UWP (Windows.UI.Xaml.Application). Os aplicativos desktop empacotados (WinUI 3, WPF, WinForms) recebem ativação de compartilhamento por meio de AppInstance.GetActivatedEventArgs e verifique se há ExtendedActivationKind.ShareTarget. Consulte Obter informações de ativação para aplicativos empacotados.
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
}
Para aplicativos desktop empacotados (WinUI 3, WPF, WinForms) criados com o SDK do Aplicativo Windows, não há substituição de OnShareTargetActivated. Em vez disso, inspecione a ativação no método Main e verifique 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. Escolha quais formatos de dados declarar
Use esta referência para decidir o que declarar:
| Format | Quando usar | Aplicativos de exemplo |
|---|---|---|
StorageItems |
Seu aplicativo recebe arquivos | Editores de fotos, leitores de documentos |
Bitmap |
Seu aplicativo recebe imagens | Visualizadores de imagem, aplicativos de design |
Text |
Seu aplicativo recebe texto sem formatação | Aplicativos de anotações, editores de texto |
Html |
Seu aplicativo recebe conteúdo em texto formatado | Clientes de email, editores avançados |
Uri / WebLink |
Seu aplicativo manipula links | Navegadores, gerenciadores de link |
Rtf |
Seu aplicativo recebe texto formatado | processadores Word |
Para obter mais detalhes, consulte a referência DataFormat &FileType.
Implementar destino de compartilhamento para PWAs (Aplicativos Web Progressivos)
PWAs no Windows são registrados como um destino de compartilhamento por meio do manifesto do aplicativo Web. Adicione uma share_target entrada:
{
"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/*"]
}
]
}
}
}
Na sua rota /share, trate a solicitação 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('/');
});
Declare apenas os tipos de arquivo que o PWA pode manipular. Por exemplo, não declare * como um tipo aceito, a menos que seu aplicativo realmente ofereça suporte a todos os arquivos.
Receber compartilhamentos em um aplicativo Win32 não empacotado
Para se registrar como um Destino de Compartilhamento, seu aplicativo precisa da identidade do pacote. Se o aplicativo Win32 estiver desempacotado, conceda a ele a identidade do pacote de uma das duas maneiras:
- Reempacotar com MSIX (recomendado): use o modelo Projeto de Empacotamento de Aplicativo do Windows no Visual Studio para obter uma instalação limpa e confiável. Consulte Configure o aplicativo desktop para empacotamento MSIX.
- Pacote com localização externa (pacote esparso): adicione um pacote MSIX vazio que carrega identidade, o registro de destino de compartilhamento e ativos visuais, enquanto o instalador existente continua gerenciando os binários do aplicativo. Use isto somente quando você tiver um instalador que não possa migrar para o MSIX.
O restante desta seção apresenta a abordagem de localização externa.
1. Criar o manifesto do pacote
Crie um AppxManifest.xml que define <uap10:AllowExternalContent>, declara identidade e capacidades, além de registrar o destino de compartilhamento. Mantenha Publisher, PackageName e ApplicationId sincronizados com seu .exe.manifest e certificado de assinatura.
<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>
Adicione um manifesto do aplicativo (YourApp.exe.manifest) que vincule o executável à identidade do pacote:
<?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. Criar e assinar o pacote
Use MakeAppx.exe com a opção /nv para criar um pacote que contenha apenas o manifesto e assine-o com um certificado confiável usando 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>
Instale o certificado de assinatura em um local confiável no computador.
3. Registrar o pacote na primeira execução
Na primeira execução, registre o pacote de localização externa para que o aplicativo seja reiniciado com a identidade. Forneça caminhos absolutos para a localização externa e para o .msix assinado.
[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. Manipular a ativação de compartilhamento
Depois que o aplicativo for reiniciado com a identidade, manipule ExtendedActivationKind.ShareTarget conforme mostrado em Manipular a ativação do Compartilhamento.
Para obter exemplos completos, consulte o exemplo PhotoStoreDemo (empacotado com localização externa) e o exemplo de Destino de Compartilhamento WinUI.
Para compartilhamento de área de trabalho do lado da origem, use IDataTransferManagerInterop conforme descrito no compartilhamento de conteúdo do seu aplicativo.
Práticas Recomendadas
Use essa lista de verificação ao criar fluxos de recebimento.
| Recommended | Evite | Por que isso importa |
|---|---|---|
| Declarar somente extensões de arquivo e formatos de dados específicos | Declarando <uap:SupportsAnyFileType /> para aplicativos que não movem arquivos |
Evita a exibição de destinos irrelevantes no Share Sheet |
| Validar formato, contagem, tipo de arquivo e tamanho do arquivo antes do processamento | Supondo que os dados de entrada sempre correspondam às expectativas | Impede falhas de runtime e experiências de compartilhamento interrompidas |
Declarar Uri para manipuladores de link e Bitmap + StorageItems para manipuladores de imagem |
Declarações parciais para conteúdos de compartilhamento comuns | Garante que seu aplicativo apareça para o conteúdo com o qual ele é realmente compatível |
Usar ReportStarted, ReportDataRetrievede ReportCompleted em fluxos de recebimento de execução longa |
Realização de um trabalho de execução prolongada sem relatório de andamento | Mantém a operação de compartilhamento confiável e fornece ao sistema o estado correto |
Informar progresso do recebimento (opcional, mas recomendado)
Para conteúdos grandes ou processamento mais demorado, informe o status do destino do compartilhamento:
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}");
}
}
Use ReportCompleted(QuickLink) quando quiser retornar um QuickLink para compartilhamentos futuros.
Solução de problemas
Meu aplicativo não aparece na Planilha de Compartilhamento:
- Verifique se as declarações de manifesto correspondem ao conteúdo que está sendo compartilhado (verifique os tipos de arquivo e os formatos de dados).
- Para aplicativos empacotados, verifique se você está executando o aplicativo com a identidade do pacote.
- Verifique a referência de DataFormat & FileType da categoria do seu aplicativo.
Meu aplicativo aparece para tipos de conteúdo que ele não consegue processar:
- Restrinja suas listas de
SupportedFileTypeseDataFormatapenas ao que você oferece suporte.
Compartilhar Folha é ignorado com a um erro:
- Certifique-se de chamar
ReportStarted()antes de qualquer operação assíncrona eReportCompleted()quando terminar. - Trate exceções e invoque
ReportError()com uma mensagem descritiva.
Não estou recebendo o arquivo que espero:
- Verifique se o formato de arquivo corresponde a um declarado
FileTypeouDataFormat. - Adicione lógica de validação ao manipulador de ativação para inspecionar o que realmente está chegando.
Conteúdo relacionado
Windows developer