Starta Skärmklippsverktyget

Den här artikeln anger protokollet för integrering av program från första och tredje part med Windows Snipping Tool med hjälp av schemat ms-screenclip: URI (Uniform Resource Identifier). Protokollet stöder insamling av bilder och video (med ljud) via skärmklippsverktyget, och appuppringare kan välja vilka funktioner i skärmklippsverktyget som deras app ska visa.

Important

Det här protokollet kräver en packaged Windows app (MSIX). När din app paketeras tillhandahåller operativsystemet automatiskt appens identitet till Snipping Tool, som använder den för att på ett säkert sätt dirigera insamlingssvaret tillbaka till din app. Opackade (Win32)-anropare kan inte ta emot svar via redirect-uri. Om en uppackad app tillhandahåller ett redirect-uri, levererar inte Snipping Tool svaret och kan stängas utan att visa fångstgränssnittet.

Note

Det här protokollet ersätter upplevelsen som dokumenteras i Starta skärmsnippning (inaktuell), som nu är inaktuell.

Funktioner som stöds

Protokollet Snipping Tool stöder följande funktioner:

  • Rektangelupptagning
  • Frihandstagning
  • Avbildning av fönster
  • Skärminspelning
  • Anpassa tillgängliga avbildningslägen
  • Spara automatiskt (valfritt)

Protokollspecifikation

URI-format:ms-screenclip://{host}/{path}?{query parameters}

Komponent Description Värden
System Det anpassade schemat för Snipping Tool ms-screenclip
Värd Den snipping Tool-åtgärd som ska utföras capture eller discover
Path Medietypen att fånga (gäller endast för värd capture; värd discover har ingen sökväg) /image eller /video
Query Parametrar för åtgärden Se tabeller nedan

Note

Sökvägar och frågeparameternamn är skiftlägesokänsliga. Beter sig till exempel ms-screenclip://capture/Image?Redirect-Uri=my-app://response på samma sätt som ms-screenclip://capture/image?redirect-uri=my-app://response.

Avbilda värd

Använd capture-värden för att starta Snipping Tools avbildningsöverlägg.

Väg

Väg Description
/image Startar skärminspelning. Kräver en lägesparameter.
/video Startar videoinspelning (skärminspelning). Använder alltid rektangelläge.

Lägesparametrar (uppfångning/avbildning)

/image För sökvägen måste du ange exakt en lägesparameter. Lägesparametrar är enkla query-parametrar utan värde.

Parameter Description
rectangle Interaktiv rektangel avbildningsläge.
freeform Interaktiva frihandsinspelningsläget.
window Interaktivt avbildningsläge för fönster.

Important

Lägesparametrar måste anges utan värde. Använd till &rectangle exempel, inte&rectangle=value. Om du anger ett värde får du ett felsvar.

För /imagemåste du ange exakt en lägesparameter. Om du anger noll eller mer än ett läge resulterar det i ett 400 Bad Request felsvar. För /videoignoreras alla lägesparametrar.

Frågeparametrar (avbildning)

Note

Frågeparametrar kan anges i valfri ordning.

Parameter Type Obligatoriskt Description Standardinställning
redirect-uri URI Yes Återkallnings-URI där Snipping Tool skickar det fångade svaret. Din app måste registrera en protokollhanterare för det här URI-schemat. Om det utelämnas visas inte avbildningsverktyget i avbildningsgränssnittet och returnerar inte något svar. Inte tillämpligt
user-agent snöre Nej (rekommenderas starkt) Identifierare för det anropande programmet som används för loggning och analys. Krävs för att diagnostisera problem via supportkanaler; utelämna på egen risk. Inte tillämpligt
api-version snöre Nej Protokollversion som ska användas, till exempel "1.2". Om begäran utelämnas bearbetas den som version 1.2. 1.2
x-request-correlation-id snöre Nej Unik identifierare för begäran, vilket tillåter referens till en viss transaktion eller händelsekedja. Automatiskt genererat GUID
enabledModes sträng (lista) Nej Styr vilka avbildningslägen som är tillgängliga i användargränssnittet. Se EnabledModes nedan. Endast det läge som anges i URI:n
auto-save flag Nej När den insamlade skärmbilden eller inspelningen finns sparas den automatiskt på användarens enhet. Finns inte (ingen automatisk sparande)

Note

Standardvärdet api-version1.2 ändras inte när nyare protokollversioner släpps. Begäranden som utelämnar api-version bearbetas alltid som 1.2. Om du vill använda funktioner som lagts till i en senare version anger du api-version till den versionen. Vi rekommenderar att api-version du uttryckligen anger i varje begäran så att appen förblir knuten till en känd protokollversion i stället för den implicita standardinställningen.

Note

När du anger api-versionmåste det exakt matcha ett av värdena i /discover svarets supportedVersions matris (för närvarande 1.0, 1.1och 1.2). Alla andra värden – inklusive mellanliggande värden som 1.15 eller felaktigt formaterade värden som 1.0abc – returnerar ett 400 Bad Request svar. Om du vill identifiera vilka versioner en specifik Snipping Tool-version accepterar, anropar du discover host.

Note

Flaggan auto-save respekterar användarens inställningar för skärmklippningsverktyget. Om användaren har inaktiverat automatisk besparing i Snipping Tool sparas inte avbildningen på enheten även när din begäran innehåller auto-save.

Identifiera värd

Använd discover värd för att fråga Snipping Tools stödda funktioner, lägen och protokollversioner under körning. Detta är användbart för att kontrollera kompatibiliteten innan du gör en avbildningsbegäran.

Frågeparametrar (upptäck)

Parameter Type Obligatoriskt Description Standardinställning
redirect-uri URI Yes Återanrops-URI där Snipping Tool skickar funktionssvaret. Din app måste registrera en protokollhanterare för det här URI-schemat. Om det utelämnas returnerar Skärmklippsverktyget inte något svar. Inte tillämpligt
user-agent snöre Nej (rekommenderas starkt) Identifierare för det anropande programmet som används för loggning och analys. Inte tillämpligt
x-request-correlation-id snöre Nej Unik identifierare för begäran. Automatiskt genererat GUID

Upptäck exempel

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

Identifiera svarsformat

Svaret är ett JSON-objekt som läggs till i omdirigerings-URI:n som frågeparameter discover. Den innehåller:

  • version: Den senaste protokollversionen som stöds av denna Snipping Tool-byggnad.
  • defaultVersion: Protokollversion som antas när en begäran utelämnar api-version. Läs det här för att förstå hur dina opinnade begäranden tolkas.
  • supportedVersions: Matris med protokollversioner som den här Snipping Tool-versionen accepterar.
  • capabilities: Matris med avbildningsåtgärder som stöds, var och en med:
    • path: Avbildningsslutpunkten (t.ex. capture/image, capture/video).
    • methods: HTTP-liknande metoder som stöds.
    • parameters: Tillgängliga parametrar för slutpunkten.
    • description: Beskrivning av funktionen.
{
  "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."
    }
  ]
}

AktiveradeLägen

Med enabledModes parametern kan du styra vilka avbildningslägen som är tillgängliga i användargränssnittet för skärmklippsverktyget. Använd den för att begränsa eller utöka användarens val för att matcha programmets krav.

Lägen som stöds

Mode Description
RectangleSnip Rektangel avbildningsläge.
WindowSnip Avbildningsläge för fönster.
FreeformSnip Frihandsläge för avbildning
FullscreenSnip Helskärmsläge för avbildning.
SnippingAllModes Alla avbildningslägen: RectangleSnip, WindowSnip, FreeformSnip, FullscreenSnip.
RectangleRecord Rektangulärt inspelningsläge.
RecordAllModes Alla inspelningslägen: endast för närvarande RectangleRecord .
All Alla lägen som stöds: union av SnippingAllModes och RecordAllModes.

Tips/Råd

All, SnippingAllModes, och RecordAllModes är aggregerade värden. De lägen som de innehåller kan ändras i Snipping Tool-versioner. En app som använder något av dessa värden hämtar automatiskt lägen som läggs till i framtida versioner. Om du vill behålla samma uppsättning av tillgängliga lägen över flera uppdateringar listar du de specifika lägena (till exempel RectangleSnip,FreeformSnip).

Important

  • För /imagerectangle en lägesparameter (t.ex. freeform, window, ) i URI:n, även när enabledModes anges. Lägesparametern avgör det ursprungligen valda läget.
  • Det läge som anges i URI:n är alltid tillgängligt i användargränssnittet, även om det inte visas i enabledModes. Gör till exempel ?freeform&enabledModes=RectangleSnip både frihandsfigur (från URI) och rektangelfragment tillgängligt, med frihandsfiguren förvald.
  • Om enabledModes utelämnas är endast det läge som anges i URI:n tillgängligt i användargränssnittet.
  • För /image, om ingen lägesparameter har angetts, är begäran ogiltig och resulterar i ett fel, oavsett enabledModes.

EnabledModes-exempel

Aktivera endast rektangelfragment:

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

Aktivera rektangel- och fönsterutklipp:

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

Aktivera alla skärmklippslägen:

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

Aktivera endast inspelningsläge:

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

Aktivera flera skärmklipps- och inspelningsalternativ:

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

Eftersom fri form har angetts i URI:n kommer den att vara förvald. Användare kan växla mellan frihandsklipp, rektangelklipp och rektangelinspelning.

Responses

När användaren har slutfört eller avbrutit en avbildning skickar Snipping Tool ett svar tillbaka till ditt program via redirect-uri. Svaret är strukturerat som URI-frågeparametrar som läggs till i din omdirigerings-URI.

Om dina redirect-uri redan innehåller frågeparametrar (till exempel my-app://response?sessionId=abc), bevaras dessa parametrar och svarsparametrarna läggs till med &. Du kan använda detta för att återanropsspecifikt tillstånd via återanropet – värdet sessionId=abc upprepas i svars-URI:n tillsammans med code, reason, x-request-correlation-idoch (för en lyckad avbildning) file-access-token.

Svarsparametrar

Parameter Type Närvarande Description
code int Always STATUSkod i HTTP-format som anger resultatet.
reason snöre Always Mänskligt läsbar beskrivning av resultatet.
x-request-correlation-id snöre Always Korrelations-ID:t från den ursprungliga begäran (eller ett automatiskt genererat).
file-access-token snöre Enbart framgång En SharedStorageAccessManager token som representerar det insamlade mediet. Använd detta för att hämta filen.
discover snöre Upptäck endast URL-kodad JSON som innehåller funktionssvaret.

Statuskoder

Kod Förnuft Description
200 Success Infångningen har slutförts framgångsrikt. A file-access-token ingår i svaret.
400 Felaktig begäran – Ogiltiga eller saknade parametrar Det gick inte att bearbeta begäran. Kontrollera att alla obligatoriska parametrar finns och är giltiga.
408 Tidsgräns för begäran – åtgärden tog för lång tid Tidsgränsen för åtgärden gick ut innan den slutfördes.
499 Kundbegäran stängd – användaren avbröt förfrågan Användaren avbröt avbildningen genom att trycka på Escape eller klicka bort. Gäller endast för /image och /video .
500 Internt serverfel – bearbetningen misslyckades Ett oväntat fel uppstod under insamlingen.

Exempelsvar

Lyckad avbildning:

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

Användaren avbröt:

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

Ogiltig begäran (saknad modeparameter):

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

Fullständiga URI-exempel

Användningsfall URI Description
Skärmbild av rektangel ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response Interaktiv rektangelinsamling. Resultatet returnerades till anroparen.
Skärmbild av frihandsformulär ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response Interaktiv frihandsfångst. Resultatet returnerades till anroparen.
Skärmbild av fönster ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response Interaktiv fönsterinspelning. Resultatet returnerades till anroparen.
Skärminspelning ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response Interaktiv skärminspelning. Resultatet returnerades till anroparen.
Identifiera funktioner ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response Förfrågan om stödda funktioner. Kapaciteter JSON returnerades till anroparen.
Rektangel med automatisk sparande ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response Rektangelfångst med automatiskt sparande aktiverat.
Rektangel med alla mod ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response Rektangelinsamling förvald, alla lägen som är tillgängliga i användargränssnittet.

Starta från din app

Du måste använda Launcher.LaunchUriAsync för att starta Snipping Tool från din paketerade app. Andra startmetoder (till exempel Process.Start eller shell-körning) ger inte appens identitet, och Snipping Tool levererar inte svaret.

Steg 1: Registrera en protokollhanterare

Registrera ett anpassat protokoll i din Package.appxmanifest så att appen kan ta emot motringningssvaret. Protokollnamnet måste matcha schemat som används i din 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>

Mer information om hur du registrerar och hanterar protokollaktiveringar finns i Hantera URI-aktivering .

Steg 2: Starta Skärmklippverktyget

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

Steg 3: Hantera svaret

När fångsten har slutförts (eller användaren avbryter), aktiverar Snipping Tool din app via din redirect-uri med resultatparametrar som läggs till i form av frågesträngar. De flesta integreringar körs redan när svaret kommer – anroparen startade Snipping Tool och väntade sedan på återanropet – så appen måste hantera både kallstartsaktivering (appen kördes inte) och varm återaktivering (appen körs redan). Prenumerera på båda banorna i App.xaml.cs.

Hantera ett avbildningssvar (bild eller video):

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

Hantera ett upptäckingssvar:

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
    }
}

Tips/Råd

Om du har skickat en x-request-correlation-id med begäran, kontrollera att svaret återger samma värde så att du kan matcha svaret till rätt pågående begäran. Om du låter Snipping Tool generera ett automatiskt, bär svaret det genererade värdet – behandla det som att matcha din senaste begäran under flygning.

Hämtar insamlade medier med hjälp av token

Använd klassen SharedStorageAccessManager för att lösa in file-access-token och komma åt den insamlade filen.

Tokenbegränsningar:

  • En token kan bara lösas in en gång. Efter inlösen är den inte längre giltig.
  • En token upphör att gälla efter 14 dagar.
  • En app får inte ha fler än 1 000 aktiva token. När en token har lösts in, tagits bort eller upphör att gälla räknas den inte längre mot kvoten.
// 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);

Säkerhetsfrågor

Snipping Tool verifierar alla redirect-uri värden innan du startar dem. Följande skydd tillämpas:

  • Packeterade applikationsanrop: När din app är en paketerad Windows-app (MSIX), dirigerar operativsystemet säkert insamlingssvaret tillbaka till din app, så att endast din app kan ta emot det. Det här är den rekommenderade integreringsvägen.
  • Indatavalidering: Klippverktyget avvisar omdirigerings-URI:er som innehåller UNC-sökvägar, inledande och avslutande blanksteg, eller kontrolltecken.
  • Inga fragment: Omdirigerings-URI:er som innehåller ett URL-fragment (till exempel my-app://response#section) avvisas. Snipping Tool lägger till svarsparametrarna som en frågesträng, och ett fragment skulle svälja dem.
  • Självrefererande skydd: Omdirigerings-URI:er som skulle orsaka rekursiv aktivering av Snipping Tool blockeras.

Important

För att anropa program:

  • Registrera en protokollhanterare för ditt omdirigerings-URI-schema så att din app kan ta emot svaret.
  • Verifiera och sanera alla parametrar som tas emot i svaret innan du bearbetar dem.
  • Kontrollera att svaret x-request-correlation-id matchar din begäran under flygning för att undvika att hantera ett inaktuellt svar eller blanda ihop samtidiga begäranden. Korrelations-ID förhindrar förväxlingar; den etablerar inte token proveniens – säker tokenroutning kommer från den paketerade appens återanropskanal.