Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 ometapi-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’ilenabledModesest 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=RectangleSniprend disponibles les options de capture libre (à partir de l’URI) et rectangulaire, avec la capture libre pré-sélectionnée. - S’il
enabledModesest 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 deenabledModes.
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-idcorrespond à 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.
Contenu connexe
Windows developer