Iniciar a ferramenta de recorte

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 omite api-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 quando enabledModes é 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=RectangleSnip disponibiliza tanto o formato livre (do URI) como o corte de retângulo, com o formato livre pré-selecionado.
  • Caso enabledModes seja 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 de enabledModes.

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-id correspondem 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.