Iniciar ferramenta de captura

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 é omitida api-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 quando enabledModes é 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=RectangleSnip oferece as opções de recorte de forma livre (do URI) e de retângulo, com a forma livre pré-selecionada.
  • Se enabledModes for 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 de enabledModes.

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.