Lancer Snipping Tool

Cet article spécifie le protocole permettant d’intégrer des applications internes et tierces à l’outil Windows Snipping à l’aide du schéma ms-screenclip : URI (Uniform Resource Identifier). Le protocole prend en charge la capture d’images et de vidéos (avec audio) via l’outil Snipping, et les appelants d’application peuvent choisir les fonctionnalités de l’outil de capture d’écran affichées par leur application.

Important

Ce protocole nécessite une application packaged Windows (MSIX). Lorsque votre application est empaquetée, le système d’exploitation fournit automatiquement l’identité de votre application à Snipping Tool, qui l’utilise pour acheminer en toute sécurité la réponse de capture vers votre application. Les appelants non empaquetés (Win32) ne peuvent pas recevoir de réponses via redirect-uri. Si une application non empaquetée fournit un redirect-uri, l'outil Snipping ne livrera pas la réponse et peut se fermer sans afficher l'interface de capture.

Note

Ce protocole remplace l’expérience documentée dans la capture d’écran de lancement (déconseillée), qui est désormais déconseillée.

Fonctionnalités prises en charge

Le protocole Snipping Tool prend en charge les fonctionnalités suivantes :

  • Capture de rectangle
  • Capture de forme libre
  • Capture de fenêtre
  • Enregistrement d’écran
  • Personnalisation des modes de capture disponibles
  • Enregistrement automatique (facultatif)

Spécification du protocole

Format d’URI :ms-screenclip://{host}/{path}?{query parameters}

Composant Description Valeurs
Modèle Schéma personnalisé pour l’outil Snipping ms-screenclip
Hôte Opération de l’outil de capture d’écran à effectuer capture ou discover
Chemin d’accès Type de média à capturer (s’applique uniquement à l’hôte capture ; l’hôte n’a pas de discover chemin d’accès) /image ou /video
Query Paramètres de l’opération Voir les tableaux ci-dessous

Note

Les chemins d’accès et les noms de paramètres de requête sont insensibles à la casse. Par exemple, ms-screenclip://capture/Image?Redirect-Uri=my-app://response se comporte de la même façon que ms-screenclip://capture/image?redirect-uri=my-app://response.

Hôte de capture

Utilisez l’hôte capture pour lancer la superposition de capture de l'outil de capture Snipping.

Chemin

Chemin Description
/image Lance la capture d’image (capture d’écran). Nécessite un paramètre de mode.
/video Lance la capture vidéo (enregistrement d’écran). Utilise toujours le mode rectangle.

Paramètres de mode (capture/image)

Pour le chemin d’accès /image , vous devez spécifier exactement un paramètre de mode. Les paramètres de mode sont des paramètres de requête nus sans valeur.

Paramètre Description
rectangle Mode de capture de rectangle interactif.
freeform Mode de capture de forme libre interactive.
window Mode de capture de fenêtre interactive.

Important

Les paramètres de mode doivent être spécifiés sans valeur. Par exemple, utilisez &rectangle, et non&rectangle=value. La fourniture d’une valeur entraîne une réponse d’erreur.

Pour /image, vous devez spécifier exactement un paramètre de mode. La spécification de zéro ou de plusieurs modes entraîne une 400 Bad Request réponse d’erreur. Pour /video, n’importe quel paramètre de mode est ignoré.

Paramètres de requête (capture)

Note

Les paramètres de requête peuvent être fournis dans n’importe quel ordre.

Paramètre Type Obligatoire Description Par défaut
redirect-uri URI Oui URI de rappel où snipping Tool envoie la réponse de capture. Votre application doit inscrire un gestionnaire de protocole pour ce schéma d’URI. En cas d’omission, l’outil Snipping n’affiche pas l’interface utilisateur de capture et ne retourne pas de réponse. n/a
user-agent string Non (fortement recommandé) Identificateur de l’application appelante, utilisé pour la journalisation et l’analytique. Requis pour diagnostiquer les problèmes via des canaux de support ; omettez à votre propre risque. n/a
api-version string Non Version du protocole à utiliser, par exemple "1.2". Si elle est omise, la requête est traitée en tant que version 1.2. 1.2
x-request-correlation-id string Non Identificateur unique de la requête, permettant la référence à une transaction ou une chaîne d’événements particulière. GUID généré automatiquement
enabledModes chaîne (liste) Non Contrôle les modes de capture disponibles dans l’interface utilisateur. Voir EnabledModes ci-dessous. Seul le mode spécifié dans l’URI
auto-save flag Non Lorsqu’il est présent, la capture d’écran ou l’enregistrement capturé est automatiquement enregistré sur l’appareil de l’utilisateur. Non présent (pas d’enregistrement automatique)

Note

La valeur par défaut de api-version de 1.2 ne change pas lorsqu'une nouvelle version de protocole est publiée. Les demandes qui omettent api-version sont toujours traitées en tant que 1.2. Pour utiliser des fonctionnalités ajoutées dans une version ultérieure, réglez api-version sur cette version. Nous vous recommandons de api-version spécifier explicitement dans chaque requête afin que votre application reste liée à une version de protocole connue plutôt qu’à la valeur par défaut implicite.

Note

Lorsque vous fournissez api-version, il doit correspondre exactement à l’une des valeurs du tableau de /discover la supportedVersions réponse (actuellement1.0, 1.1et 1.2). Toute autre valeur, y compris les valeurs intermédiaires comme 1.15 ou les valeurs malformées comme 1.0abc, produit une réponse 400 Bad Request. Pour découvrir l'ensemble des versions qu'une build spécifique de Snipping Tool accepte, utilisez discover host.

Note

L’indicateur auto-save respecte les paramètres de l’outil de capture d’écran de l’utilisateur. Si l’utilisateur a désactivé l’enregistrement automatique dans Snipping Tool, la capture n’est pas enregistrée sur l’appareil même lorsque votre demande inclut auto-save.

Découvrir l’hôte

Utilisez l’hôte discover pour interroger les fonctionnalités, modes et versions de protocole prises en charge par l’outil Snipping au moment de l’exécution. Cela est utile pour vérifier la compatibilité avant d’effectuer une demande de capture.

Paramètres de requête (découverte)

Paramètre Type Obligatoire Description Par défaut
redirect-uri URI Oui URI de rappel où Snipping Tool envoie la réponse aux fonctionnalités. Votre application doit inscrire un gestionnaire de protocole pour ce schéma d’URI. En cas d’omission, l’outil Snipping ne retourne pas de réponse. n/a
user-agent string Non (fortement recommandé) Identificateur de l’application appelante, utilisé pour la journalisation et l’analytique. n/a
x-request-correlation-id string Non Identificateur unique de la requête. GUID généré automatiquement

Découvrez un exemple

ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response

Découvrir le format de réponse

La réponse est un objet JSON ajouté à l’URI de redirection en tant que paramètre de discover requête. Il contient :

  • version : dernière version du protocole que cette build de l'outil Capture d’écran prend en charge.
  • defaultVersion: version du protocole supposée lorsqu’une requête omet api-version. Lisez ceci pour comprendre comment vos requêtes non épinglées sont interprétées.
  • supportedVersions: Tableau des versions de protocole que cette version de l’outil capture d'écran accepte.
  • capabilities: Tableau d’opérations de capture prises en charge, chacune avec :
    • path: point de terminaison de capture (par exemple, capture/image, capture/video).
    • methods: méthodes de type HTTP prises en charge.
    • parameters: paramètres disponibles pour le point de terminaison.
    • description: Description de la fonctionnalité.
{
  "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."
    }
  ]
}

Modes activés

Le enabledModes paramètre vous permet de contrôler les modes de capture disponibles dans l’interface utilisateur de l’outil de capture. Utilisez-la pour restreindre ou développer les choix de l’utilisateur en fonction des exigences de votre application.

Modes pris en charge

Mode Description
RectangleSnip Mode de capture rectangulaire.
WindowSnip Mode de capture de fenêtre.
FreeformSnip Mode de capture de forme libre.
FullscreenSnip Mode de capture plein écran.
SnippingAllModes Tous les modes de capture d’image : RectangleSnip, WindowSnip, FreeformSnip, FullscreenSnip.
RectangleRecord Mode d’enregistrement rectangle.
RecordAllModes Tous les modes d’enregistrement : actuellement RectangleRecord uniquement.
All Tous les modes pris en charge : union de SnippingAllModes et RecordAllModes.

Tip

All, SnippingAllModeset RecordAllModes sont des valeurs d’agrégation. Les modes qu’ils incluent peuvent changer dans les versions de l’outil de capture d’écran. Une application qui utilise l’une de ces valeurs récupère automatiquement les modes ajoutés dans les versions ultérieures. Pour conserver l’ensemble des modes disponibles fixes entre les mises à jour, répertoriez explicitement les modes spécifiques (par exemple). RectangleSnip,FreeformSnip

Important

  • Pour /image, un paramètre de mode (par exemple, rectangle, freeform, window) est requis dans l’URI, même lorsqu’il enabledModes est spécifié. Le paramètre de mode détermine le mode initialement sélectionné.
  • Le mode spécifié dans l’URI est toujours disponible dans l’interface utilisateur, même s’il n’est pas répertorié dans enabledModes. Par exemple, ?freeform&enabledModes=RectangleSnip rend disponibles les options de capture libre (à partir de l’URI) et rectangulaire, avec la capture libre pré-sélectionnée.
  • S’il enabledModes est omis, seul le mode spécifié dans l’URI sera disponible dans l’interface utilisateur.
  • Pour /image, si aucun paramètre de mode n’est spécifié, la requête n’est pas valide et entraîne une erreur, indépendamment de enabledModes.

Exemples de EnabledModes

Activez uniquement le rectangle snip :

ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip&user-agent=MyApp&redirect-uri=my-app://response

Activer la capture de rectangle et de fenêtre :

ms-screenclip://capture/image?rectangle&enabledModes=RectangleSnip,WindowSnip&user-agent=MyApp&redirect-uri=my-app://response

Activez tous les modes de capture d’écran :

ms-screenclip://capture/image?rectangle&enabledModes=SnippingAllModes&user-agent=MyApp&redirect-uri=my-app://response

Activez le mode d’enregistrement uniquement :

ms-screenclip://capture/video?enabledModes=RecordAllModes&user-agent=MyApp&redirect-uri=my-app://response

Activez plusieurs modes d’enregistrement et de capture :

ms-screenclip://capture/image?freeform&enabledModes=RectangleSnip,RectangleRecord&user-agent=MyApp&redirect-uri=my-app://response

Étant donné que la forme libre est spécifiée dans l’URI, elle est pré-sélectionnée. Les utilisateurs peuvent basculer entre découpe en forme libre, découpe rectangulaire et enregistrement rectangulaire.

Responses

Une fois que l’utilisateur a terminé ou annulé une capture, l’outil Snipping renvoie une réponse à votre application via le redirect-uri. La réponse est structurée en tant que paramètres de requête URI ajoutés à votre URI de redirection.

Si vous redirect-uri incluez déjà des paramètres de requête (par exemple, my-app://response?sessionId=abc), ces paramètres sont conservés et les paramètres de réponse sont ajoutés avec &. Vous pouvez l'utiliser pour transférer l'état spécifique de l'appelant via le rappel. La valeur sessionId=abc est renvoyée dans l'URI de réponse avec code, reason, x-request-correlation-id, et (pour une capture réussie) file-access-token.

Paramètres de réponse

Paramètre Type Présent Description
code int Toujours Code d’état de style HTTP indiquant le résultat.
reason string Toujours Description lisible par l’homme du résultat.
x-request-correlation-id string Toujours ID de corrélation de la requête d’origine (ou un ID de corrélation généré automatiquement).
file-access-token string Réussite uniquement Jeton SharedStorageAccessManager représentant le média capturé. Utilisez cette option pour récupérer le fichier.
discover string Découvrir uniquement JSON encodé en URL contenant la réponse des fonctionnalités.

Codes d’état

Code Reason Description
200 Success La capture s’est terminée avec succès. Un file-access-token est inclus dans la réponse.
400 Requête incorrecte - Paramètres non valides ou manquants La demande n’a pas pu être traitée. Vérifiez que tous les paramètres requis sont présents et valides.
408 Délai d’expiration de la demande - L’opération a pris trop de temps L’opération a été interrompue avant son achèvement.
499 Demande fermée du client - L’utilisateur a annulé le Snip L’utilisateur a annulé la capture en appuyant sur Échap ou en cliquant ailleurs. S’applique à /image et /video uniquement.
500 Erreur interne du serveur - Échec du traitement Une erreur inattendue s’est produite lors de la capture.

Exemples de réponses

Capture réussie :

my-app://response?code=200&reason=Success&x-request-correlation-id=aaaa0000-bb11-2222-33cc-444444dddddd&file-access-token=cccc2222-dd33-4444-55ee-666666ffffff

L’utilisateur a annulé :

my-app://response?code=499&reason=Client%20Closed%20Request%20-%20User%20Cancelled%20the%20Snip&x-request-correlation-id=bbbb1111-cc22-3333-44dd-555555eeeeee

Requête non valide (paramètre de mode manquant) :

my-app://response?code=400&reason=Bad%20Request%20-%20Invalid%20or%20Missing%20Parameters&x-request-correlation-id=bbbb1111-cc22-3333-44dd-555555eeeeee

Exemples d’URI complets

Cas d’usage URI Description
Capture d’écran du rectangle ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response Capture de rectangle interactif. Résultat retourné à l’appelant.
Capture d’écran freeform ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response Capture de forme libre interactive. Résultat retourné à l’appelant.
Capture d’écran de la fenêtre ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response Capture de fenêtre interactive. Résultat retourné à l’appelant.
Enregistrement d’écran ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response Enregistrement d’écran interactif. Résultat retourné à l’appelant.
Découvrir les fonctionnalités ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response Fonctionnalités prises en charge par la requête. Fonctionnalités JSON retournées à l’appelant.
Rectangle avec enregistrement automatique ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response Capture de rectangles avec enregistrement automatique activé.
Rectangle avec tous les modes ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response Capture rectangle pré-sélectionnée, tous les modes disponibles dans l’interface utilisateur.

Lancement à partir de votre application

Vous devez utiliser Launcher.LaunchUriAsync pour lancer L’outil Snipping à partir de votre application empaquetée. D’autres méthodes de lancement (telles que Process.Start l’exécution de l’interpréteur de commandes) ne fournissent pas l’identité de votre application et L’outil Snipping ne fournit pas la réponse.

Étape 1 : Inscrire un gestionnaire de protocole

Inscrivez un protocole personnalisé dans votre Package.appxmanifest application afin que votre application puisse recevoir la réponse de rappel. Le nom du protocole doit correspondre au schéma utilisé dans votre 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>

Pour plus d’informations sur l’inscription et la gestion des activations de protocole, consultez Gérer l’activation d’URI .

Étape 2 : Lancer l’outil de capture d’écran

// 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);

Étape 3 : Gérer la réponse

Une fois la capture terminée (ou en cas d'annulation par l'utilisateur), l'outil Capture active votre application via votre redirect-uri avec les paramètres de résultat ajoutés sous forme de chaînes de requête. La plupart des intégrations sont déjà en cours d’exécution lorsque la réponse arrive ( l’appelant a lancé l’outil Snipping, puis attendu le rappel), de sorte que votre application doit gérer à la fois l’activation de démarrage à froid (l’application n’était pas en cours d’exécution) et la réactivation chaude (l’application est déjà en cours d’exécution). Abonnez-vous aux deux parcours dans App.xaml.cs.

Gérer une réponse de capture (image ou vidéo) :

// 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}");
    }
}

Gérer une réponse de découverte :

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

Si vous avez envoyé un élément x-request-correlation-id avec la demande, vérifiez que la réponse renvoie la même valeur afin de pouvoir faire correspondre la réponse à la demande en cours de traitement. Si vous laissez l'outil de capture générer automatiquement une valeur, la réponse porte la valeur générée : traitez-la comme correspondant à votre demande la plus récente en cours.

Récupération d’un média capturé à l’aide du jeton

Utilisez la classe SharedStorageAccessManager pour valider file-access-token et accéder au fichier capturé.

Restrictions de jeton :

  • Un jeton ne peut être échangé qu’une seule fois. Après l’échange, il n’est plus valide.
  • Un jeton expire après 14 jours.
  • Une application ne peut pas avoir plus de 1 000 jetons actifs. Une fois qu’un jeton est échangé, supprimé ou expire, il ne compte plus par rapport au 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);

Considérations relatives à la sécurité

L’application Snipping Tool valide toutes les valeurs redirect-uri avant de les lancer. Les protections suivantes sont appliquées :

  • Appelants d’application empaquetés : lorsque votre application est une application Windows empaquetée (MSIX), le système d’exploitation achemine en toute sécurité la réponse de capture vers votre application, ce qui garantit que seule votre application peut la recevoir. Il s’agit du chemin d’intégration recommandé.
  • Validation d’entrée : L’outil de capture d’écran rejette les URI de redirection qui contiennent des chemins UNC, des espaces blancs de début/fin ou des caractères de contrôle.
  • Aucun fragment : les URI de redirection qui contiennent un fragment d’URL (par exemple) my-app://response#sectionsont rejetés. L’outil de capture ajoute les paramètres de réponse sous forme de chaîne de requête, et un fragment les avale.
  • Protection de référencement automatique : les URI de redirection qui provoquent l’activation récursive de l’outil Snipping sont bloquées.

Important

Pour les applications appelantes :

  • Inscrivez un gestionnaire de protocole pour votre schéma d’URI de redirection afin que votre application puisse recevoir la réponse.
  • Validez et désinfectez tous les paramètres reçus dans la réponse avant de les traiter.
  • Vérifiez que la réponse x-request-correlation-id correspond à votre demande en cours d’exécution pour éviter de gérer une réponse obsolète ou de mélanger les requêtes simultanées. L’ID de corrélation empêche les confusions ; il n’établit pas la provenance des jetons — le routage sécurisé des jetons provient du canal de rappel empaqueté de l’application packagée.