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.
Este artigo especifica o protocolo para integrar aplicativos de primeira e terceiros à Ferramenta de Captura do Windows usando o esquema URI (Uniform Resource Identifier) de ms-screenclip:. O protocolo dá suporte à captura de imagens e vídeos (com áudio) por meio da Ferramenta de Snipping, e os chamadores de aplicativo podem escolher quais recursos da Ferramenta de Snipping seu aplicativo exibirá.
Importante
Esse protocolo requer um aplicativo Windows compactado (MSIX). Quando seu aplicativo é empacotado, o sistema operacional fornece automaticamente a identidade do aplicativo para a Ferramenta de Captura, que a utiliza para encaminhar com segurança a resposta de captura de volta para seu aplicativo. Chamadores não empacotados (Win32) não podem receber respostas por meio de redirect-uri. Se um aplicativo não empacotado fornecer um redirect-uri, a Ferramenta de Snipping não fornecerá a resposta e poderá sair sem mostrar a interface do usuário de captura.
Note
Esse protocolo substitui a experiência documentada em captura de tela de inicialização (obsoleto), que agora está obsoleto.
Recursos com suporte
O protocolo Snipping Tool dá suporte aos seguintes recursos:
- Captura de retângulo
- Captura de forma livre
- Captura de janela
- Gravação de Tela
- Personalizando os modos de captura disponíveis
- Salvamento automático (opcional)
Especificação de protocolo
Formato de URI:ms-screenclip://{host}/{path}?{query parameters}
| Componente | Description | Valores |
|---|---|---|
| Scheme | O esquema personalizado para a Ferramenta de Snipping | ms-screenclip |
| Host | A operação Ferramenta de Snipping a ser executada |
capture ou discover |
| Caminho | O tipo de mídia a ser capturado (aplica-se somente ao capture host; o discover host não tem caminho) |
/image ou /video |
| Query | Parâmetros para a operação | Veja as tabelas abaixo |
Note
Caminhos e nomes de parâmetros de consulta são insensíveis a diferenciação de maiúsculas e minúsculas. Por exemplo, ms-screenclip://capture/Image?Redirect-Uri=my-app://response comporta-se da mesma forma que ms-screenclip://capture/image?redirect-uri=my-app://response.
Capturar host
Use o capture host para iniciar a sobreposição de captura da Ferramenta de Snipping.
Caminho
| Caminho | Description |
|---|---|
/image |
Inicia a captura de imagem (captura de tela). Requer um parâmetro de modo. |
/video |
Inicia a captura de vídeo (gravação de tela). Sempre usa o modo retangular. |
Parâmetros de modo (captura/imagem)
Para o /image caminho, você deve especificar exatamente um parâmetro de modo. Parâmetros de modo são parâmetros de consulta sem valor.
| Parâmetro | Description |
|---|---|
rectangle |
Modo de captura de retângulo interativo. |
freeform |
Modo de captura interativa em forma livre. |
window |
Modo interativo de captura de janela. |
Importante
Parâmetros de modo devem ser especificados sem um valor. Por exemplo, use &rectangle, não&rectangle=value. Fornecer um valor resultará em uma resposta de erro.
Para /image, você deve especificar exatamente um parâmetro de modo. Especificar zero ou mais de um modo resultará em uma 400 Bad Request resposta de erro. Para /video, qualquer parâmetro de modo é ignorado.
Parâmetros de consulta (captura)
Note
Os parâmetros de consulta podem ser fornecidos em qualquer ordem.
| Parâmetro | Tipo | Obrigatório | Description | Default |
|---|---|---|---|---|
redirect-uri |
URI | Yes | URI de retorno de chamada em que a Ferramenta de Snipping envia a resposta de captura. Seu aplicativo deve registrar um manipulador de protocolo para esse esquema de URI. Se omitida, a Ferramenta de Recorte não exibirá a interface de captura e não retornará uma resposta. | n/a |
user-agent |
cadeia | Não (altamente recomendado) | Identificador do aplicativo de chamada, usado para log e análise. Necessário para diagnosticar problemas por meio de canais de suporte; omita por sua conta e risco. | n/a |
api-version |
cadeia | No | Versão do protocolo a ser usada, por exemplo "1.2". Se omitida, a solicitação será processada como versão 1.2. |
1.2 |
x-request-correlation-id |
cadeia | No | Identificador exclusivo para a solicitação, permitindo referência a uma determinada transação ou cadeia de eventos. | GUID gerado automaticamente |
enabledModes |
cadeia de caracteres (lista) | No | Controles que capturam modos estão disponíveis na interface do usuário. Veja EnabledModes abaixo. | Somente o modo especificado na URI |
auto-save |
sinalizador | No | Quando presente, a captura de tela ou gravação capturada é salva automaticamente no dispositivo do usuário. | Não está presente (sem salvamento automático) |
Note
O padrão api-version do 1.2 não é alterado quando versões de protocolo mais recentes são lançadas. As solicitações que omitem api-version são sempre processadas como 1.2. Para usar recursos adicionados em uma versão posterior, defina api-version para essa versão. É recomendável especificar api-version explicitamente em cada solicitação para que seu aplicativo permaneça vinculado a uma versão de protocolo conhecida em vez do padrão implícito.
Note
Quando você fornece api-version, ele deve corresponder exatamente a um dos valores na /discover matriz da supportedVersions resposta (atualmente 1.0, 1.1e 1.2). Qualquer outro valor , incluindo valores intermediários como 1.15 ou valores malformados, como 1.0abc – retorna uma 400 Bad Request resposta. Para descobrir o conjunto de versões que um build específico da Ferramenta de Snipping aceita, chame o host de descoberta.
Note
O auto-save flag respeita as configurações da Ferramenta de Recorte do usuário. Se o usuário tiver desabilitado o salvamento automático na Ferramenta de Snipping, a captura não será salva no dispositivo mesmo quando sua solicitação incluir auto-save.
Descobrir o host
Use o discover host para consultar os recursos, os modos e a versão de protocolo compatíveis com a Ferramenta de Snipping no runtime. Isso é útil para verificar a compatibilidade antes de fazer uma solicitação de captura.
Parâmetros de consulta (descobrir)
| Parâmetro | Tipo | Obrigatório | Description | Default |
|---|---|---|---|---|
redirect-uri |
URI | Yes | URI de retorno de chamada em que a Ferramenta de Snipping envia a resposta de recursos. Seu aplicativo deve registrar um manipulador de protocolo para esse esquema de URI. Se omitida, a Ferramenta de Snipping não retornará uma resposta. | n/a |
user-agent |
cadeia | Não (altamente recomendado) | Identificador do aplicativo de chamada, usado para log e análise. | n/a |
x-request-correlation-id |
cadeia | No | Identificador exclusivo para a solicitação. | GUID gerado automaticamente |
Descubra o exemplo
ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response
Descobrir formato de resposta
A resposta é um objeto JSON acrescentado ao URI de redirecionamento como o parâmetro de discover consulta. Ele contém:
-
version: versão de protocolo mais recente compatível com esta compilação da Ferramenta de Snipping. -
defaultVersion: versão do protocolo assumida quando uma solicitação é omitidaapi-version. Leia isso para entender como suas solicitações não fixadas são interpretadas. -
supportedVersions: matriz de versões de protocolo aceitas pelo build da Ferramenta de Snipping. -
capabilities: matriz de operações de captura com suporte, cada uma com:-
path: o ponto de extremidade de captura (por exemplo,capture/image,capture/video). -
methods: métodos semelhantes a HTTP com suporte. -
parameters: parâmetros disponíveis para o ponto de extremidade. -
description: descrição da funcionalidade.
-
{
"version": 1.2,
"defaultVersion": 1.2,
"supportedVersions": [1.0, 1.1, 1.2],
"capabilities": [
{
"path": "capture/image",
"methods": ["GET"],
"parameters": ["rectangle", "freeform", "window"],
"description": "Captures an image with options for shape."
},
{
"path": "capture/video",
"methods": ["GET"],
"parameters": [],
"description": "Captures a video in a defined area."
}
]
}
ModosAtivados
O enabledModes parâmetro permite controlar quais modos de captura estão disponíveis na interface do usuário da Ferramenta de Recorte. Use-o para restringir ou expandir as opções do usuário para corresponder aos requisitos do aplicativo.
Modos suportados
| Modo | Description |
|---|---|
RectangleSnip |
Modo de captura retangular. |
WindowSnip |
Modo de captura de janela. |
FreeformSnip |
Modo de captura de forma livre. |
FullscreenSnip |
Modo de captura de tela inteira. |
SnippingAllModes |
Todos os modos de captura de imagem: RectangleSnip, , WindowSnip, FreeformSnip. FullscreenSnip |
RectangleRecord |
Modo de gravação em retângulo. |
RecordAllModes |
Todos os modos de gravação: atualmente somente RectangleRecord. |
All |
Todos os modos suportados: a união de SnippingAllModes e RecordAllModes. |
Dica
All, SnippingAllModese RecordAllModes são valores agregados. Os modos que eles incluem podem ser alterados nas versões da Ferramenta de Snipping. Um aplicativo que usa um desses valores automaticamente seleciona os modos adicionados em versões futuras. Para manter o conjunto de modos disponíveis corrigido entre atualizações, liste os modos específicos explicitamente (por exemplo, RectangleSnip,FreeformSnip).
Importante
- Para
/image, um parâmetro de modo (por exemplo,rectangle,freeform,window) é necessário na URI, mesmo quandoenabledModesé especificado. O parâmetro de modo determina o modo inicialmente selecionado. - O modo especificado no URI está sempre disponível na interface do usuário, mesmo que não esteja listado em
enabledModes. Por exemplo,?freeform&enabledModes=RectangleSnipoferece as opções de recorte de forma livre (do URI) e de retângulo, com a forma livre pré-selecionada. - Se
enabledModesfor omitido, somente o modo especificado no URI estará disponível na interface do usuário. - Se nenhum parâmetro de modo for especificado para
/image, a requisição será inválida e resultará em um erro, independentemente deenabledModes.
Exemplos de EnabledModes
Habilitar somente recorte retangular:
ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip&user-agent=MyApp&redirect-uri=my-app://response
Habilitar captura de retângulo e de janela:
ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip,WindowSnip&user-agent=MyApp&redirect-uri=my-app://response
Habilite todos os modos de recorte:
ms-screenclip://capture/image?rectangle&enabledModes=SnippingAllModes&user-agent=MyApp&redirect-uri=my-app://response
Habilitar somente o modo de gravação:
ms-screenclip://capture/video?enabledModes=RecordAllModes&user-agent=MyApp&redirect-uri=my-app://response
Habilite múltiplos modos de captura e gravação:
ms-screenclip://capture/image?freeform&enabledModes=RectangleSnip,RectangleRecord&user-agent=MyApp&redirect-uri=my-app://response
Como a forma livre é especificada no URI, ela será pré-selecionada. Os usuários podem alternar entre recorte de forma livre, recorte de retângulo e gravação de retângulo.
Responses
Depois que o usuário concluir ou cancelar uma captura, o Snipping Tool enviará uma resposta de volta ao seu aplicativo por meio do redirect-uri. A resposta é estruturada como parâmetros de consulta URI acrescentados ao URI de redirecionamento.
Se seu redirect-uri já incluir parâmetros de consulta (por exemplo, my-app://response?sessionId=abc), esses parâmetros serão preservados e os parâmetros de resposta serão acrescentados ao &. Você pode usá-lo para transitar o estado específico do chamador através do retorno de chamada — o valor sessionId=abc é refletido no URI de resposta junto com code, reason, x-request-correlation-id e (para uma captura bem-sucedida) file-access-token.
Parâmetros de resposta
| Parâmetro | Tipo | Presente | Description |
|---|---|---|---|
code |
int | Sempre | Código de status de estilo HTTP que indica o resultado. |
reason |
cadeia | Sempre | Descrição legível pelo ser humano do resultado. |
x-request-correlation-id |
cadeia | Sempre | A ID de correlação da solicitação original (ou uma gerada automaticamente). |
file-access-token |
cadeia | Apenas sucesso | Um SharedStorageAccessManager token que representa a mídia capturada. Use isso para recuperar o arquivo. |
discover |
cadeia | Somente descobrir | JSON codificado em URL contendo a resposta de capacidades. |
Códigos de status
| Code | Reason | Description |
|---|---|---|
| 200 | Êxito | A captura foi concluída com êxito. Um file-access-token é incluído na resposta. |
| 400 | Solicitação inválida - Parâmetros inválidos ou ausentes | Não foi possível processar a solicitação. Verifique se todos os parâmetros necessários estão presentes e válidos. |
| 408 | Tempo limite da solicitação – a operação demorou muito | A operação atingiu o tempo limite antes da conclusão. |
| 499 | solicitação fechada do cliente – o usuário cancelou o snip | O usuário cancelou a captura pressionando Escape ou clicando fora. Aplica-se a /image e /video somente. |
| 500 | Erro interno do servidor – Falha no processamento | Ocorreu um erro inesperado durante a captura. |
Respostas de exemplo
Captura bem-sucedida:
my-app://response?code=200&reason=Success&x-request-correlation-id=aaaa0000-bb11-2222-33cc-444444dddddd&file-access-token=cccc2222-dd33-4444-55ee-666666ffffff
Usuário cancelado:
my-app://response?code=499&reason=Client%20Closed%20Request%20-%20User%20Cancelled%20the%20Snip&x-request-correlation-id=bbbb1111-cc22-3333-44dd-555555eeeeee
Solicitação inválida (parâmetro de modo ausente):
my-app://response?code=400&reason=Bad%20Request%20-%20Invalid%20or%20Missing%20Parameters&x-request-correlation-id=bbbb1111-cc22-3333-44dd-555555eeeeee
Exemplos completos de URI
| Caso de uso | URI | Description |
|---|---|---|
| Captura de tela do retângulo | ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response |
Captura de retângulo interativo. Resultado retornado ao solicitante. |
| Captura de tela de forma livre | ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response |
Captura de forma livre interativa. Resultado retornado ao solicitante. |
| Captura de tela da janela | ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response |
Captura de janela interativa. Resultado retornado ao solicitante. |
| Gravação de tela | ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response |
Gravação de tela interativa. Resultado retornado ao solicitante. |
| Descobrir funcionalidades | ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response |
Consultar recursos com suporte. Funcionalidades que o JSON retornou ao chamador. |
| Retângulo com salvamento automático | ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response |
Captura de retângulo habilitada com salvamento automático. |
| Retângulo com todos os modos | ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response |
Captura de retângulo pré-selecionada, todos os modos disponíveis na interface do usuário. |
Iniciando do seu aplicativo
Você deve usar Launcher.LaunchUriAsync para iniciar a Ferramenta de Snipping do seu aplicativo empacotado. Outros métodos de inicialização (como Process.Start ou execução de shell) não fornecerão a identidade do aplicativo e a Ferramenta de Snipping não fornecerá a resposta.
Etapa 1: registrar um manipulador de protocolo
Registre um protocolo personalizado em seu Package.appxmanifest para que seu aplicativo possa receber o retorno de chamada. O nome do protocolo deve corresponder ao esquema usado em sua redirect-uri.
<Extensions>
<uap:Extension Category="windows.protocol">
<uap:Protocol Name="my-app" DesiredView="default">
<uap:DisplayName>My App Protocol</uap:DisplayName>
</uap:Protocol>
</uap:Extension>
</Extensions>
Consulte Manipular a ativação do URI para obter mais detalhes sobre como registrar e manipular ativações de protocolo.
Etapa 2: Iniciar a Ferramenta de Snipping
// Capture a screenshot in rectangle mode
var uri = new Uri(
"ms-screenclip://capture/image"
+ "?rectangle"
+ "&user-agent=MyApp"
+ "&redirect-uri=my-app://capture-response"
+ "&x-request-correlation-id=" + Guid.NewGuid().ToString()
);
await Launcher.LaunchUriAsync(uri);
// Record a video
var uri = new Uri(
"ms-screenclip://capture/video"
+ "?user-agent=MyApp"
+ "&redirect-uri=my-app://capture-response"
);
await Launcher.LaunchUriAsync(uri);
// Discover capabilities (returns immediately, no capture UI)
var uri = new Uri(
"ms-screenclip://discover"
+ "?user-agent=MyApp"
+ "&redirect-uri=my-app://discover-response"
);
await Launcher.LaunchUriAsync(uri);
Etapa 3: Tratar a resposta
Quando a captura é concluída (ou o usuário cancela), a Ferramenta de Recorte ativa seu aplicativo através de seu redirect-uri com parâmetros de resultado como cadeias de consulta. A maioria das integrações já está em execução quando a resposta chega — o chamador iniciou a Ferramenta de Snipping e, em seguida, esperou pelo retorno de chamada — portanto, seu aplicativo deve lidar com a ativação de início frio (o aplicativo não estava em execução) e a reativação morna (o aplicativo já está em execução). Assine os dois caminhos em App.xaml.cs.
Manipular uma resposta de captura (imagem ou vídeo):
// In App.xaml.cs: handle protocol activation for both cold-start and warm re-activation
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
// Cold-start path: the app was launched by Snipping Tool's callback.
var activatedArgs = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();
if (activatedArgs.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.Protocol)
{
if (activatedArgs.Data is Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs protocolArgs)
{
_ = HandleProtocolActivationAsync(protocolArgs.Uri);
}
}
// Warm re-activation path: the app is already running when the callback arrives.
Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().Activated += (sender, e) =>
{
if (e.Kind == Microsoft.Windows.AppLifecycle.ExtendedActivationKind.Protocol &&
e.Data is Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs protocolArgs)
{
_ = HandleProtocolActivationAsync(protocolArgs.Uri);
}
};
}
private async Task HandleProtocolActivationAsync(Uri uri)
{
var query = new WwwFormUrlDecoder(uri.Query);
var code = query.GetFirstValueByName("code");
var reason = query.GetFirstValueByName("reason");
if (code == "200")
{
var token = query.GetFirstValueByName("file-access-token");
var file = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
// Use the captured file (see "Retrieving captured media" below)
}
else
{
// Handle error (400, 408, 499, 500)
Debug.WriteLine($"Snipping Tool returned {code}: {reason}");
}
}
Manipular uma resposta de descoberta:
private void HandleDiscoverResponse(Uri uri)
{
var query = new WwwFormUrlDecoder(uri.Query);
var code = query.GetFirstValueByName("code");
if (code == "200")
{
var discover = query.GetFirstValueByName("discover");
// discover contains a URL-encoded JSON capabilities payload
var capabilities = Uri.UnescapeDataString(discover);
// Parse the JSON to inspect supported capture modes
}
}
Dica
Se você enviou um x-request-correlation-id com a solicitação, verifique se a resposta ecoa o mesmo valor para que você possa corresponder a resposta à solicitação em andamento correta. Se você permitir que a Ferramenta de Recorte gere automaticamente uma, a resposta carregará o valor gerado – trate-a como correspondente à sua solicitação em andamento mais recente.
Recuperando mídia capturada usando o token
Use a classe SharedStorageAccessManager para resgatar o file-access-token e acessar o arquivo capturado.
Restrições de token:
- Um token só pode ser resgatado uma vez. Após o resgate, ele não é mais válido.
- Um token expira após 14 dias.
- Um aplicativo não pode ter mais de 1000 tokens ativos. Depois que um token é resgatado, removido ou expira, ele não conta mais com a cota.
// Redeem the token and display the captured image
var file = await SharedStorageAccessManager.RedeemTokenForFileAsync(token);
using (var stream = await file.OpenReadAsync())
{
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(stream);
MyImage.Source = bitmap;
}
// Or copy to your app's local storage
var localFolder = ApplicationData.Current.LocalFolder;
await file.CopyAsync(localFolder, file.Name, NameCollisionOption.GenerateUniqueName);
Considerações de segurança
A Ferramenta de Snipping valida todos os redirect-uri valores antes de iniciá-los. As seguintes proteções são impostas:
- Chamadores de aplicativos empacotados: quando seu aplicativo é um aplicativo Windows empacotado, MSIX, o sistema operacional roteia a resposta de captura de volta para seu aplicativo com segurança, garantindo que apenas seu aplicativo possa recebê-la. Esse é o caminho de integração recomendado.
- Validação de entrada: a Ferramenta de Recorte rejeita URIs de redirecionamento que contêm caminhos UNC, espaço em branco inicial/final ou caracteres de controle.
-
Nenhum fragmento: as URIs de redirecionamento que contêm um fragmento de URL (por exemplo,
my-app://response#section) são rejeitadas. A Ferramenta de Snipping acrescenta os parâmetros de resposta como uma cadeia de caracteres de consulta e um fragmento os engoliria. - Proteção de auto-referência: URIs de redirecionamento que causariam a ativação recursiva da Ferramenta de Snipping são bloqueadas.
Importante
Para chamar aplicativos:
- Registre um manipulador de protocolo para o esquema de URI de redirecionamento para que seu aplicativo possa receber a resposta.
- Valide e sanifique todos os parâmetros recebidos na resposta antes de processá-los.
- Verifique se a resposta corresponde
x-request-correlation-idà sua solicitação em voo para evitar lidar com uma resposta obsoleta ou misturar solicitações simultâneas. O ID de correlação evita confusões; ele não estabelece a procedência do token — o roteamento seguro de tokens vem do canal de callback do aplicativo empacotado.
Conteúdo relacionado
Windows developer