Knipprogramma starten

In dit artikel wordt het protocol opgegeven voor het integreren van toepassingen van eerste en derden met het Windows knipprogramma met behulp van het schema ms-screenclip: URI-schema (Uniform Resource Identifier). Het protocol ondersteunt het vastleggen van afbeeldingen en video (met audio) via Snipping Tool, en app-oproepen kunnen kiezen welke functies van Snipping Tool in hun app worden weergegeven.

Important

Voor dit protocol is een packaged Windows app (MSIX) vereist. Wanneer uw app is verpakt, biedt het besturingssysteem automatisch de identiteit van uw app aan Het knipprogramma, dat deze gebruikt om het capture-antwoord veilig terug te sturen naar uw app. Uitgepakte bellers (Win32) kunnen geen antwoorden ontvangen via redirect-uri. Als een uitgepakte app een redirect-uriknipprogramma biedt, levert het knipprogramma het antwoord niet en wordt het mogelijk afgesloten zonder de gebruikersinterface voor vastleggen weer te geven.

Note

Dit protocol vervangt de gedocumenteerde ervaring in Startscherm knipsen (verouderd), wat nu verouderd is.

Ondersteunde functies

Het knipprogrammaprotocol ondersteunt de volgende functies:

  • Rechthoek vastleggen
  • Vrije vorm vastleggen
  • Vensteropname
  • Schermopname
  • Beschikbare opnamemodi aanpassen
  • Automatisch opslaan (optioneel)

Protocolspecificatie

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

Onderdeel Description Waarden
Schema Het aangepaste schema voor het knipprogramma ms-screenclip
Host De bewerking van het Knipprogramma, die moet worden uitgevoerd capture of discover
Path Het mediatype dat moet worden vastgelegd (alleen van toepassing op de capture host; de discover host heeft geen pad) /image of /video
Query Parameters voor de bewerking Zie de onderstaande tabellen

Note

Paden en namen van queryparameters zijn niet hoofdlettergevoelig. Gedraagt zich bijvoorbeeld ms-screenclip://capture/Image?Redirect-Uri=my-app://response hetzelfde als ms-screenclip://capture/image?redirect-uri=my-app://response.

Host opnemen

Gebruik de host om de capture capture-overlay van het knipprogramma te starten.

Pad

Pad Description
/image Start het vastleggen van afbeeldingen (schermopname). Hiervoor is een modusparameter vereist.
/video Start video-opname (scherm opnemen). Maakt altijd gebruik van de rechthoekmodus.

Modusparameters (opname/beeld)

Voor het /image pad moet u precies één modusparameter opgeven. Modusparameters zijn lege queryparameters zonder waarde.

Parameter Description
rectangle Interactieve rechthoekopnamemodus.
freeform Interactieve vrije-vormopnamemodus.
window Interactieve vensteropnamemodus.

Important

Modusparameters moeten worden opgegeven zonder een waarde. Gebruik bijvoorbeeld &rectangle, niet&rectangle=value. Als u een waarde opgeeft, resulteert dit in een foutantwoord.

Voor /imagemoet u exact één modusparameter opgeven. Als u nul of meer dan één modus opgeeft, treedt er een 400 Bad Request fout op. Elke /videomodusparameter wordt genegeerd.

Queryparameters (vastleggen)

Note

Queryparameters kunnen in elke volgorde worden opgegeven.

Parameter Typ Required Description Verstek
redirect-uri URI Yes Callback-URI waarop Knipprogramma de vangstreactie verzendt. Uw app moet een protocolhandler registreren voor dit URI-schema. Als u dit weglaat, wordt de gebruikersinterface van de Knipprogramma voor het maken van vastleggingen niet weergegeven en wordt er geen antwoord geretourneerd. n/a
user-agent touw Nee (sterk aanbevolen) Id voor de aanroepende toepassing, die wordt gebruikt voor logboekregistratie en analyse. Vereist voor het diagnosticeren van problemen via ondersteuningskanalen; negeren is op eigen risico. n/a
api-version touw Nee. Protocolversie die moet worden gebruikt, bijvoorbeeld "1.2". Als u dit weglaat, wordt de aanvraag verwerkt als versie 1.2. 1.2
x-request-correlation-id touw Nee. Unieke id voor de aanvraag, zodat er kan worden verwezen naar een bepaalde transactie of gebeurtenisketen. Automatisch gegenereerde GUID
enabledModes tekenreeks (lijst) Nee. Hiermee bepaalt u welke opnamemodi beschikbaar zijn in de gebruikersinterface. Zie EnabledModes hieronder. Alleen de modus die is opgegeven in de URI
auto-save flag Nee. Wanneer deze aanwezig is, wordt de vastgelegde schermopname of opname automatisch opgeslagen op het apparaat van de gebruiker. Niet aanwezig (geen automatisch opslaan)

Note

De standaardwaarde api-version1.2 wordt niet gewijzigd wanneer nieuwere protocolversies worden uitgebracht. Aanvragen die api-version weglaten, worden altijd verwerkt als 1.2. Als u functies wilt gebruiken die zijn toegevoegd in een latere versie, stelt u deze versie in api-version . We raden u aan expliciet op te geven api-version in elke aanvraag, zodat uw app gekoppeld blijft aan een bekende protocolversie in plaats van de impliciete standaard.

Note

Wanneer u invoert api-version, moet deze exact overeenkomen met een van de waarden in de matrix van het /discover antwoord supportedVersions (momenteel 1.0, 1.1en 1.2). Elke andere waarde, inclusief tussenliggende waarden zoals 1.15 of ongeldige waarden zoals 1.0abc, retourneert een 400 Bad Request antwoord. Als u wilt ontdekken welke versies door een specifieke Snipping Tool build worden geaccepteerd, roept u de discover host aan.

Note

De auto-save vlag respecteert de instellingen van het knipprogramma van de gebruiker. Als de gebruiker automatisch opslaan in knipprogramma heeft uitgeschakeld, wordt de opname niet op het apparaat opgeslagen, zelfs niet wanneer uw aanvraag is opgenomen auto-save.

Host detecteren

Gebruik de discover host om tijdens runtime query's uit te voeren op de ondersteunde mogelijkheden, modi en protocolversie van het knipprogramma. Dit is handig voor het controleren van de compatibiliteit voordat u een capture-aanvraag indient.

Queryparameters (ontdekken)

Parameter Typ Required Description Verstek
redirect-uri URI Yes Callback-URI waar Snipping Tool het mogelijkhedenantwoord verzendt. Uw app moet een protocolhandler registreren voor dit URI-schema. Als u dit weglaat, retourneert het knipprogramma geen antwoord. n/a
user-agent touw Nee (sterk aanbevolen) Id voor de aanroepende toepassing, die wordt gebruikt voor logboekregistratie en analyse. n/a
x-request-correlation-id touw Nee. Unieke id voor de aanvraag. Automatisch gegenereerde GUID

Voorbeeld van ontdekken

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

Antwoordindeling detecteren

Het antwoord is een JSON-object dat als queryparameter discover is toegevoegd aan de omleidings-URI. Het bevat:

  • version: De nieuwste protocolversie die deze build van het knipprogramma ondersteunt.
  • defaultVersion: Aangenomen protocolversie wanneer een aanvraag api-version weglaat. Lees dit om te begrijpen hoe uw niet-vaste aanvragen worden geïnterpreteerd.
  • supportedVersions: Matrix van protocolversies die deze knipprogramma-build accepteert.
  • capabilities: Matrix van ondersteunde opnamebewerkingen, elk met:
    • path: Het eindpunt voor vastleggen (bijvoorbeeld capture/image, capture/video).
    • methods: Ondersteunde HTTP-achtige methoden.
    • parameters: Beschikbare parameters voor het eindpunt.
    • description: Beschrijving van de mogelijkheid.
{
  "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."
    }
  ]
}

EnabledModes

enabledModes Met de parameter kunt u bepalen welke opnamemodi beschikbaar zijn in de gebruikersinterface van het knipprogramma. Gebruik deze om de keuzen van de gebruiker te beperken of uit te breiden om aan de vereisten van uw toepassing te voldoen.

Ondersteunde modi

Mode Description
RectangleSnip Rechthoekopnamemodus.
WindowSnip Vensteropnamemodus.
FreeformSnip Vrije-vormopnamemodus.
FullscreenSnip Opnamemodus voor volledig scherm.
SnippingAllModes Alle opnamemodi voor afbeeldingen: RectangleSnip, WindowSnip, FreeformSnip, . FullscreenSnip
RectangleRecord Rechthoekopnamemodus
RecordAllModes Alle opnamemodi: momenteel RectangleRecord alleen.
All Alle ondersteunde modi: de samenvoeging van SnippingAllModes en RecordAllModes.

Tip

All, SnippingAllModesen RecordAllModes zijn geaggregeerde waarden. De modi die ze bevatten, kunnen worden gewijzigd in releases van knipprogramma's. Een app die een van deze waarden gebruikt, haalt automatisch de modi op die in toekomstige releases worden toegevoegd. Als u de set beschikbare modi tussen updates wilt behouden, vermeldt u de specifieke modi expliciet (bijvoorbeeld RectangleSnip,FreeformSnip).

Important

  • Een /imagemodusparameter (bijvoorbeeld rectangle, freeformwindow) is vereist in de URI, zelfs wanneer enabledModes specifiek is. De modusparameter bepaalt de oorspronkelijk geselecteerde modus.
  • De modus die is opgegeven in de URI, is altijd beschikbaar in de gebruikersinterface, zelfs als deze niet wordt vermeld in enabledModes. Maakt bijvoorbeeld ?freeform&enabledModes=RectangleSnip zowel vrije vorm (van de URI) als rechthoeksknipsel beschikbaar, waarbij vrije vorm vooraf is geselecteerd.
  • Als enabledModes wordt weggelaten, is alleen de modus die is opgegeven in de URI beschikbaar in de gebruikersinterface.
  • Als /imageer geen modusparameter is opgegeven, is de aanvraag ongeldig en resulteert dit in een fout, ongeacht enabledModes.

Voorbeelden van EnabledModes

Alleen rechthoekuitknipsel inschakelen:

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

Schakel rechthoek- of vensterknip in:

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

Schakel alle knipmodi in:

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

Alleen opnamemodus inschakelen:

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

Schakel meerdere knip- en opnamemodi in:

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

Omdat vrije vorm is opgegeven in de URI, wordt deze vooraf geselecteerd. Gebruikers kunnen schakelen tussen vrije vorm, rechthoekfragment en rechthoekopname.

Responses

Nadat de gebruiker een opname voltooit of annuleert, stuurt het Knipprogramma een antwoord terug naar uw applicatie via de redirect-uri. Het antwoord is gestructureerd als URI-queryparameters die zijn toegevoegd aan uw omleidings-URI.

Als de redirect-uri queryparameters al zijn opgenomen (bijvoorbeeld my-app://response?sessionId=abc), blijven deze parameters behouden en worden de antwoordparameters toegevoegd aan &. U kunt dit gebruiken om de aanroeperspecifieke status via de retouraanroep heen en weer te sturen. De waarde sessionId=abc wordt samen met code, reason, x-request-correlation-id en (voor een geslaagde opname) file-access-token herhaald in de antwoord-URI.

Antwoordparameters

Parameter Typ Aanwezig Description
code int Always Http-stijl statuscode die het resultaat aangeeft.
reason touw Always Leesbare beschrijving van het resultaat.
x-request-correlation-id touw Always De correlatie-id van de oorspronkelijke aanvraag (of een automatisch gegenereerde id).
file-access-token touw Alleen geslaagd Een SharedStorageAccessManager token dat de vastgelegde media vertegenwoordigt. Gebruik dit om het bestand op te halen.
discover touw Enkel ontdekken JSON met URL-codering die het antwoord op de mogelijkheden bevat.

Statuscodes

Code Reden Description
200 Success De opname is voltooid. Een file-access-token is opgenomen in het antwoord.
400 Foute aanvraag: Ongeldige of ontbrekende parameters De aanvraag kan niet worden verwerkt. Controleer of alle vereiste parameters aanwezig en geldig zijn.
408 Time-out van aanvraag : de bewerking duurde te lang Er is een time-out opgetreden voordat de bewerking is voltooid.
499 Gesloten clientaanvraag - Gebruiker heeft de Snip geannuleerd De gebruiker heeft de opname geannuleerd door op Escape te drukken of weg te klikken. Van toepassing op /image en /video alleen.
500 Interne serverfout - verwerking mislukt Er is een onverwachte fout opgetreden tijdens het vastleggen.

Voorbeeldantwoorden

Geslaagde opname:

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

Gebruiker geannuleerd:

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

Ongeldige aanvraag (ontbrekende modusparameter):

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

Volledige URI-voorbeelden

Gebruikssituatie URI Description
Schermopname van rechthoek ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response Interactieve rechthoekopname. Resultaat geretourneerd aan beller.
Schermafbeelding van vrije vorm ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response Interactieve vrije vorm opname. Resultaat geretourneerd aan beller.
Schermopname van venster ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response Interactieve vensteropname. Resultaat geretourneerd aan beller.
Schermopname ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response Interactieve schermopname. Resultaat geretourneerd aan beller.
Mogelijkheden ontdekken ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response Vraag de ondersteunde functies op. Mogelijkheden die JSON heeft geretourneerd aan de aanroeper.
Rechthoek met automatisch opslaan ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response Rechthoekopname met automatisch opslaan ingeschakeld.
Rechthoek met alle modi ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response Rechthoekopname vooraf geselecteerd, alle modi die beschikbaar zijn in de gebruikersinterface.

Starten vanuit uw app

U moet Launcher.LaunchUriAsync gebruiken om het knipprogramma te starten vanuit uw verpakte app. Andere startmethoden (zoals Process.Start of het uitvoeren van shell-commando's) geven de identiteit van uw app niet door, en Snipping Tool levert geen reactie.

Stap 1: Een protocolhandler registreren

Registreer een aangepast protocol in uw Package.appxmanifest app, zodat uw app het callback-antwoord kan ontvangen. De protocolnaam moet overeenkomen met het schema dat wordt gebruikt in uw 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>

Zie URI-activering afhandelen voor meer informatie over het registreren en verwerken van protocolactivering.

Stap 2: Knipprogramma starten

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

Stap 3: het antwoord afhandelen

Wanneer de opname is voltooid (of de gebruiker annuleert), activeert Snipping Tool uw app via uw redirect-uri met resultaatparameters die als querystrings zijn toegevoegd. De meeste integraties worden al uitgevoerd wanneer het antwoord binnenkomt - de aanroeper heeft Knipprogramma gestart en vervolgens gewacht op een terugroepbericht - dus uw app moet zowel de koude-startactivering verwerken (de app was niet actief) als de warme heractivatie (de app draait al). Abonneer u op beide routes in App.xaml.cs.

Een antwoord voor vastleggen verwerken (afbeelding of 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}");
    }
}

Een antwoord op een ontdekking verwerken:

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

Als u een x-request-correlation-id aanvraag hebt verzonden, controleert u of het antwoord dezelfde waarde weergeeft, zodat u het antwoord kunt vergelijken met de juiste aanvraag tijdens de vlucht. Als u Snipping Tool automatisch een knipsel laat genereren, bevat het antwoord de gegenereerde waarde. Behandel deze als een match voor uw meest recente lopende verzoek.

Vastgelegde media ophalen met behulp van het token

Gebruik de klasse SharedStorageAccessManager om het file-access-token vastgelegde bestand in te wisselen en te openen.

Tokenbeperkingen:

  • Een token kan slechts eenmaal worden ingewisseld. Na inwisseling is deze niet meer geldig.
  • Een token verloopt na 14 dagen.
  • Een app mag niet meer dan 1000 actieve tokens hebben. Nadat een token is ingewisseld, verwijderd of verlopen, wordt het niet meer meegeteld voor het quotum.
// 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);

Beveiligingsoverwegingen

Het knipprogramma valideert alle redirect-uri waarden voordat u ze start. De volgende beveiligingen worden afgedwongen:

  • Packaged app-bellers: Wanneer uw app een verpakte Windows-app (MSIX) is, stuurt het besturingssysteem het opnameantwoord veilig terug naar uw app, zodat alleen uw app deze kan ontvangen. Dit is het aanbevolen integratiepad.
  • Invoervalidatie: Snipping Tool weigert omleidings-URI's die UNC-paden, voorloop- of volgspaties, of besturingstekens bevatten.
  • Geen fragmenten: omleidings-URI's die een URL-fragment (bijvoorbeeld my-app://response#section) bevatten, worden geweigerd. Het knipprogramma voegt de antwoordparameters toe als een querytekenreeks en er wordt een fragment ingeslikt.
  • Zelfverwijzende beveiliging: omleidings-URI's die recursieve activering van het knipprogramma veroorzaken, worden geblokkeerd.

Important

Voor het aanroepen van toepassingen:

  • Registreer een protocolhandler voor uw omleidings-URI-schema, zodat uw app het antwoord kan ontvangen.
  • Valideer en saneer alle parameters die in het antwoord zijn ontvangen voordat u ze verwerkt.
  • Controleer of het antwoord x-request-correlation-id overeenkomt met uw in-flight-aanvraag om te voorkomen dat een verlopen antwoord wordt verwerkt of dat gelijktijdige aanvragen worden vermengd. Correlatie-id voorkomt mix-ups; er wordt geen token-herkomst vastgesteld. Veilige tokenroutering is afkomstig van het callbackkanaal van de verpakte app.