Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo especifica o protocolo para integrar aplicações de primeira e terceira parte com a Windows Snipping Tool utilizando o esquema URI (Uniform Resource Identifier) ms-screenclip:. O protocolo suporta a captura de imagens e vídeo (com áudio) através da Ferramenta de Recorte, e os utilizadores da aplicação podem escolher quais as funcionalidades da Ferramenta de Corte que a sua aplicação irá mostrar.
Importante
Este protocolo requer uma aplicação Windows empacotada (MSIX). Quando a sua aplicação é embalada, o sistema operativo fornece automaticamente a identidade da sua aplicação ao Snipping Tool, que a utiliza para encaminhar de forma segura a resposta de captura de volta à sua aplicação. Os chamadores não empacotados (Win32) não podem receber respostas via redirect-uri. Se uma aplicação não empacotada incluir um redirect-uri, a Ferramenta de Recorte não fornecerá resposta e pode sair sem apresentar a interface de captura.
Note
Este protocolo substitui a experiência documentada no recorte de ecrã inicial (Obsoleto), que agora está descontinuado.
Funcionalidades suportadas
O protocolo Snipping Tool suporta as seguintes funcionalidades:
- Captura de Retângulo
- Captura Livre
- Captura de Janela
- Gravação de tela
- Personalização dos modos de captura disponíveis
- Gravação automática (opcional)
Especificação do protocolo
Formato URI:ms-screenclip://{host}/{path}?{query parameters}
| Componente | Description | Valores |
|---|---|---|
| Esquema | O esquema personalizado para a Ferramenta de Corte | ms-screenclip |
| Host | A operação da Ferramenta de Corte que se irá realizar |
capture ou discover |
| Path | O tipo de media a capturar (aplica-se apenas ao capture anfitrião; o discover anfitrião não tem caminho) |
/image ou /video |
| Consulta | Parâmetros para a operação | Ver tabelas abaixo |
Note
Os caminhos e os nomes dos parâmetros de consulta não fazem distinção entre 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.
Captura de hospedeiro
Usa o capture host para iniciar a sobreposição de captura do Snipping Tool.
Caminho
| Caminho | Description |
|---|---|
/image |
Inicia a captura de imagem (captura de ecrã). Requer um parâmetro de modo. |
/video |
Inicia a captura de vídeo (gravação de ecrã). Usa sempre o modo retângulo. |
Parâmetros de modo (captura/imagem)
Para o /image trajeto, deve especificar exatamente um parâmetro de modo. Os parâmetros de modo são parâmetros de consulta simples sem valor.
| Parâmetro | Description |
|---|---|
rectangle |
Modo interativo de captura retangular. |
freeform |
Modo interativo de captura em formato livre. |
window |
Modo interativo de captura de janelas. |
Importante
Os parâmetros de modo devem ser especificados sem um valor. Por exemplo, use &rectangle, não&rectangle=value. Fornecer um valor resultará numa resposta de erro.
Para /image, deve especificar exatamente um parâmetro de modo. Especificar zero ou mais do que um modo resultará numa 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 | Predefinição |
|---|---|---|---|---|
redirect-uri |
URI | Yes | URI de chamada de retorno onde o Snipping Tool envia a resposta de captura. A sua aplicação deve registar um gestor de protocolo para este esquema de URIs. Se for omitido, a Ferramenta de Recorte não mostra a interface de captura e não responde. | não aplicável |
user-agent |
cadeia (de caracteres) | Não (altamente recomendado) | Identificador da aplicação que chama, usado para registo e análise. É obrigado a diagnosticar problemas através dos canais de suporte; omita por tua conta e risco. | não aplicável |
api-version |
cadeia (de caracteres) | Não | Versão do protocolo a usar, por exemplo "1.2". Se for omitido, o pedido é processado como versão 1.2. |
1.2 |
x-request-correlation-id |
cadeia (de caracteres) | Não | Identificador único para o pedido, permitindo referência a uma determinada cadeia de transações ou eventos. | GUID gerado automaticamente |
enabledModes |
String (lista) | Não | Controla quais modos de captura estão disponíveis na interface do utilizador. Veja Modos Ativados abaixo. | Apenas o modo especificado no URI |
auto-save |
sinalizador | Não | Quando presente, a captura de ecrã ou gravação capturada é automaticamente guardada no dispositivo do utilizador. | Ausente (sem auto-salvamento) |
Note
O padrão api-version de 1.2 não muda quando são lançadas versões mais recentes do protocolo. Pedidos que omitam api-version são sempre processados como 1.2. Para usar funcionalidades adicionadas numa versão posterior, definido api-version para essa versão. Recomendamos especificar api-version explicitamente em cada pedido para que a sua aplicação fique ligada a uma versão conhecida do protocolo em vez do padrão implícito.
Note
Quando fornece api-version, deve corresponder exatamente a um dos valores no /discover array da supportedVersions resposta (atualmente 1.0, 1.1, e 1.2). Qualquer outro valor — incluindo valores intermédios como 1.15 ou valores malformados como 1.0abc — retorna uma 400 Bad Request resposta. Para descobrir o conjunto de versões que uma build específica da Ferramenta de Corte aceita, execute o discover host.
Note
A auto-save bandeira respeita as definições da Ferramenta de Corte do utilizador. Se o utilizador desativou a gravação automática na Ferramenta de Corte, a captura não é guardada no dispositivo mesmo quando o seu pedido inclui auto-save.
Descobrir anfitrião
Use o discover host para consultar as capacidades, modos e versão do protocolo suportados pela Ferramenta de Recorte em tempo de execução. Isto é útil para verificar a compatibilidade antes de fazer um pedido de captura.
Parâmetros de consulta (descobrir)
| Parâmetro | Tipo | Obrigatório | Description | Predefinição |
|---|---|---|---|---|
redirect-uri |
URI | Yes | Callback URI onde o Snipping Tool envia a resposta de capacidades. A sua aplicação deve registar um gestor de protocolo para este esquema de URIs. Caso seja omitido, a Ferramenta de Recorte não devolverá uma resposta. | não aplicável |
user-agent |
cadeia (de caracteres) | Não (altamente recomendado) | Identificador da aplicação que chama, usado para registo e análise. | não aplicável |
x-request-correlation-id |
cadeia (de caracteres) | Não | Identificador único para o pedido. | GUID gerado automaticamente |
Descubra exemplo
ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response
Descobrir o formato de resposta
A resposta é um objeto JSON anexado ao URI de redirecionamento como parâmetro de discover consulta. Contém:
-
version: Versão de protocolo mais recente que esta versão da Ferramenta de Recorte suporta. -
defaultVersion: Versão do protocolo assumida quando um pedido omiteapi-version. Lê isto para perceberes como os teus pedidos não fixados são interpretados. -
supportedVersions: Conjunto de versões de protocolo aceitas por esta versão da Ferramenta de Recorte. -
capabilities: Array de operações de captura suportadas, cada uma com:-
path: O ponto final de captura (por exemplo,capture/image,capture/video). -
methods: Suportava métodos semelhantes a HTTP. -
parameters: Parâmetros disponíveis para o endpoint. -
description: Descrição da capacidade.
-
{
"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."
}
]
}
Modos Ativados
O enabledModes parâmetro permite-lhe controlar quais os modos de captura disponíveis na interface da Ferramenta de Corte. Use-o para restringir ou expandir as escolhas do utilizador para corresponder aos requisitos da sua aplicação.
Modos suportados
| Mode | Description |
|---|---|
RectangleSnip |
Modo de captura retangular. |
WindowSnip |
Modo de captura de janela. |
FreeformSnip |
Modo de captura livre. |
FullscreenSnip |
Modo de captura em ecrã inteiro. |
SnippingAllModes |
Todos os modos de captura de imagem: RectangleSnip, WindowSnip, FreeformSnip, FullscreenSnip. |
RectangleRecord |
Modo de gravação rectangular. |
RecordAllModes |
Todos os modos de gravação: atualmente apenas RectangleRecord. |
All |
Todos os modos suportados: a união de SnippingAllModes e RecordAllModes. |
Tip
All, SnippingAllModes, e RecordAllModes são valores agregados. Os modos incluídos podem mudar ao longo das versões da Ferramenta de Recorte. Uma aplicação que utiliza um destes valores capta automaticamente modos adicionados em versões futuras. Para manter o conjunto de modos disponíveis fixo ao longo das atualizações, liste explicitamente os modos específicos (por exemplo, RectangleSnip,FreeformSnip).
Importante
- Para
/image, um parâmetro de modo (por exemplo,rectangle,freeform,window) é necessário no 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, mesmo que não esteja listado em
enabledModes. Por exemplo,?freeform&enabledModes=RectangleSnipdisponibiliza tanto o formato livre (do URI) como o corte de retângulo, com o formato livre pré-selecionado. - Caso
enabledModesseja omitido, apenas o modo especificado no URI estará disponível na interface do utilizador. - Para
/image, se nenhum parâmetro de modo for especificado, o pedido é inválido e resultará num erro, independentemente deenabledModes.
Exemplos de EnabledModes
Ativar apenas o modo de recorte retangular:
ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip&user-agent=MyApp&redirect-uri=my-app://response
Ativar o corte de rectângulos e janelas:
ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip,WindowSnip&user-agent=MyApp&redirect-uri=my-app://response
Ativar todos os modos de corte:
ms-screenclip://capture/image?rectangle&enabledModes=SnippingAllModes&user-agent=MyApp&redirect-uri=my-app://response
Ativar apenas o modo de gravação:
ms-screenclip://capture/video?enabledModes=RecordAllModes&user-agent=MyApp&redirect-uri=my-app://response
Ative múltiplos modos de corte e gravação:
ms-screenclip://capture/image?freeform&enabledModes=RectangleSnip,RectangleRecord&user-agent=MyApp&redirect-uri=my-app://response
Como o formato livre está especificado no URI, será pré-selecionado. Os utilizadores podem alternar entre recorte livre, corte retangular e gravação retangular.
Responses
Depois de o utilizador concluir ou cancelar uma captura, a Ferramenta de Corte envia uma resposta de volta à sua aplicação através do redirect-uri. A resposta está estruturada como parâmetros de consulta URI adicionados ao seu URI de redirecionamento.
Se your redirect-uri já inclui parâmetros de consulta (por exemplo, my-app://response?sessionId=abc), esses parâmetros são preservados e os parâmetros de resposta são acrescentados a &. Pode usar isto para fazer uma ida e volta ao estado específico do chamador através do callback — o valor sessionId=abc é ecoado de volta no URI da resposta juntamente com code, reason, x-request-correlation-id, e (para uma captura bem-sucedida) file-access-token.
Parâmetros de resposta
| Parâmetro | Tipo | Atualidade | Description |
|---|---|---|---|
code |
int | Always | Código de estado ao estilo HTTP que indica o resultado. |
reason |
cadeia (de caracteres) | Always | Descrição legível para humanos do desfecho. |
x-request-correlation-id |
cadeia (de caracteres) | Always | O ID de correlação do pedido original (ou de um gerado automaticamente). |
file-access-token |
cadeia (de caracteres) | Apenas sucesso | Um SharedStorageAccessManager símbolo representando os media capturados. Usa isto para recuperar o ficheiro. |
discover |
cadeia (de caracteres) | Descobrir Só | JSON codificado em URL contendo a resposta das capacidades. |
Códigos de status
| Code | Reason | Description |
|---|---|---|
| 200 | Sucesso | A captura foi concluída com sucesso. A file-access-token está incluída na resposta. |
| 400 | Pedido Mau - Parâmetros Inválidos ou em Falta | O pedido não pôde ser processado. Verifique se todos os parâmetros necessários estão presentes e válidos. |
| 408 | Pedido de Tempo - Operação Demorou Demasiado | A operação terminou antes de ser concluída. |
| 499 | Pedido Encerrado pelo Cliente - Utilizador Cancelou o Snip | O utilizador cancelou a captura pressionando Escape ou clicando fora. Aplica-se a /image e /video apenas. |
| 500 | Erro do Servidor Interno - Falha no Processamento | Ocorreu um erro inesperado durante a captura. |
Exemplos de respostas
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
Utilizador cancelado:
my-app://response?code=499&reason=Client%20Closed%20Request%20-%20User%20Cancelled%20the%20Snip&x-request-correlation-id=bbbb1111-cc22-3333-44dd-555555eeeeee
Pedido inválido (parâmetro de modo em falta):
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 ecrã retangular | ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response |
Captura retangular interativa. Resultado devolvido ao chamador. |
| Captura de ecrã em forma livre | ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response |
Captura de formato livre e interativa. Resultado devolvido ao cliente. |
| Captura de ecrã da janela | ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response |
Captura interativa de janela. Resultado devolvido ao chamador. |
| Gravação de ecrã | ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response |
Gravação interativa do ecrã. Resultado devolvido ao solicitante. |
| Descobrir capacidades | ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response |
Consultar funcionalidades suportadas. Capacidades do JSON devolvidas ao chamador. |
| Retângulo com autosave | ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response |
Captura de retângulos com auto-save ativada. |
| Retângulo com todos os modos | ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response |
Captura de retângulos pré-selecionada, todos os modos disponíveis na interface. |
Lançar a partir da sua aplicação
Deve usar o Launcher.LaunchUriAsync para iniciar a Ferramenta de Corte a partir da sua aplicação incluída. Outros métodos de lançamento (como shell ou execução Process.Start) não fornecerão a identidade do seu app, e o Snipping Tool não fornecerá a resposta.
Passo 1: Registar um manipulador de protocolo
Regista um protocolo personalizado no Package.appxmanifest para que a tua aplicação possa receber a resposta de callback. O nome do protocolo deve corresponder ao esquema usado no seu 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 Ativação de URI para mais detalhes sobre registo e gestão de ativações de protocolos.
Passo 2: Iniciar a Ferramenta de Corte
// 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);
Passo 3: Lidar com a resposta
Quando a captura termina (ou o utilizador cancela), o Snipping Tool ativa a sua aplicação através de redirect-uri, com parâmetros de resultado adicionados como strings de consulta. A maioria das integrações já está em execução quando a resposta chega — o interlocutor lançou a Ferramenta de Recorte e depois aguardou pela chamada de retorno — por isso a sua aplicação tem de gerir tanto a ativação a frio (a aplicação não estava a funcionar) como a reativação a quente (a aplicação já está em funcionamento). Registe-se em ambos os percursos em App.xaml.cs.
Lidar com 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}");
}
}
Processar 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
}
}
Tip
Se enviaste um x-request-correlation-id com o pedido, verifica se a resposta ecoa o mesmo valor para que possas comparar a resposta com o pedido correto durante o voo. Se deixar o Snipping Tool gerar automaticamente um, a resposta retorna o valor gerado — considere-o como correspondendo ao seu pedido em curso mais recente.
Recuperação de media capturada usando o token
Use a classe SharedStorageAccessManager para resgatar file-access-token e aceder ao ficheiro capturado.
Restrições de tokens:
- Um token só pode ser resgatado uma vez. Depois da redenção, deixa de ser válida.
- Um token expira após 14 dias.
- Uma aplicação não pode ter mais de 1000 tokens ativos. Depois de um token ser resgatado, removido ou expirar, deixa de contar para a quota.
// 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
O Snipping Tool valida todos os redirect-uri valores antes de os lançar. São aplicadas as seguintes proteções:
- Chamadores de aplicações empacotadas: Quando a sua aplicação é uma aplicação de Windows empacotada (MSIX), o sistema operativo encaminha de forma segura a resposta de captura de volta para a sua aplicação, garantindo que apenas a sua aplicação pode recebê-la. Este é o caminho de integração recomendado.
- Validação de entrada: A Ferramenta de Corte rejeita URIs de redirecionamento que contenham caminhos UNC, espaços em branco iniciais/finais ou caracteres de controlo.
-
Sem fragmentos: URIs de redirecionamento que contenham um fragmento de URL (por exemplo,
my-app://response#section) são rejeitados. O Snipping Tool adiciona os parâmetros de resposta como uma string de consulta, e um fragmento engoliria-os. - Proteção auto-referencial: URIs de redirecionamento que causariam ativação recursiva da Ferramenta de Corte são bloqueados.
Importante
Para aplicações de chamada:
- Regista um handler de protocolo para o teu esquema de URI de redirecionamento para que a tua aplicação possa receber a resposta.
- Valide e higienize todos os parâmetros recebidos na resposta antes de os processar.
- Verifique se as respostas
x-request-correlation-idcorrespondem ao seu pedido durante o voo para evitar lidar com uma resposta obsoleta ou confundir pedidos simultâneos. Correlation-id previne confusões; não estabelece a proveniência do token — o encaminhamento seguro do token vem do canal de callback da aplicação empacotada.
Conteúdo relacionado
Windows developer