切り取りツールを起動する

この記事では、ms-screenclip: URI (Uniform Resource Identifier) スキームを使用して、ファースト パーティおよびサード パーティのアプリケーションを Windows Snipping Tool と統合するためのプロトコルを指定します。 このプロトコルは、Snipping Tool を使用した画像とビデオのキャプチャ (オーディオ付き) をサポートしており、アプリの呼び出し元は、アプリで表示する Snipping Tool 機能を選択できます。

Important

このプロトコルには、パッケージ化されたWindows アプリ (MSIX) が必要です。 アプリがパッケージ化されると、オペレーティング システムによってアプリの ID が自動的に Snipping Tool に提供されます。この ID を使用して、キャプチャ応答をアプリに安全にルーティングします。 パッケージ化されていない (Win32) 呼び出し元は、 redirect-uri経由で応答を受信できません。 パッケージ化されていないアプリが redirect-uriを提供する場合、Snipping Tool は応答を配信せず、キャプチャ UI を表示せずに終了する可能性があります。

Note

このプロトコルは、 起動画面の切り取り (非推奨) に記載されているエクスペリエンスを置き換えます。現在は非推奨です。

サポートされている機能

Snipping Tool プロトコルでは、次の機能がサポートされています。

  • 矩形キャプチャー
  • フリーフォーム キャプチャ
  • ウィンドウ キャプチャ
  • 画面の記録
  • 使用可能なキャプチャ モードのカスタマイズ
  • 自動保存 (省略可能)

プロトコルの仕様

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

コンポーネント Description 価値観
Scheme 切り取りツールのカスタム スキーム ms-screenclip
ホスト Snipping Tool で実行する操作 capture または discover
Path キャプチャするメディアの種類 ( capture ホストにのみ適用され、 discover ホストにはパスがありません) /image または /video
クエリ 操作のパラメーター 以下の表を参照してください

Note

パスとクエリ パラメーター名では、ケースが区別されません。 たとえば、 ms-screenclip://capture/Image?Redirect-Uri=my-app://responsems-screenclip://capture/image?redirect-uri=my-app://responseと同じように動作します。

ホストのキャプチャ

capture ホストを使用して、Snipping Tool のキャプチャ オーバーレイを起動します。

Path

Path Description
/image イメージ キャプチャを起動します (スクリーンショット)。 モード パラメーターが必要です。
/video ビデオ キャプチャ (画面記録) を起動します。 常に四角形モードを使用します。

モード パラメーター (キャプチャ/イメージ)

/image パスには、1 つのモード パラメーターを指定する必要があります。 モード パラメーターは、 値のないベア クエリ パラメーターです。

パラメーター Description
rectangle 対話型の四角形キャプチャ モード。
freeform 対話型フリーフォーム キャプチャ モード。
window 対話型ウィンドウ キャプチャ モード。

Important

Mode パラメーターは、値を指定せずに指定する必要があります。 たとえば、&rectangle&rectangle=value使用します。 値を指定すると、エラー応答が発生します。

/imageの場合は、1 つのモード パラメーターを指定する必要があります。 0 または複数のモードを指定すると、 400 Bad Request エラー応答が発生します。 /videoの場合、どのモード パラメーターも無視されます。

クエリ パラメーター (キャプチャ)

Note

クエリ パラメーターは任意の順序で指定できます。

パラメーター タイプ 必須 Description デフォルト
redirect-uri URI イエス Snipping Tool がキャプチャ応答を送信するコールバック URI。 アプリでは、この URI スキームのプロトコル ハンドラーを登録する必要があります。 省略した場合、Snipping Tool はキャプチャ UI を表示せず、応答を返しません。 なし
user-agent 文字列 いいえ (強くお勧めします) ログ記録と分析に使用される呼び出し元アプリケーションの識別子。 サポート チャネルを介して問題を診断するために必要です。ご自身の責任で省略してください。 なし
api-version 文字列 No 使用するプロトコルのバージョン ( "1.2"など)。 省略すると、要求はバージョン 1.2として処理されます。 1.2
x-request-correlation-id 文字列 No 特定のトランザクションまたはイベント チェーンへの参照を許可する、要求の一意の識別子。 自動生成された GUID
enabledModes string (list) No UI で使用できるキャプチャ モードを制御します。 EnabledModes を以下参照してください。 URI で指定されたモードのみ
auto-save フラグ No 表示されると、キャプチャされたスクリーンショットまたは記録がユーザーのデバイスに自動的に保存されます。 存在しない (自動保存なし)

Note

新しいプロトコル バージョンがリリースされたときに、api-versionの既定の1.2は変更されません。 api-versionを省略した要求は、常に1.2として処理されます。 新しいバージョンで追加された機能を使用するには、 api-version をそのバージョンに設定します。 アプリが暗黙的な既定値ではなく既知のプロトコル バージョンに関連付けられているように、すべての要求で api-version を明示的に指定することをお勧めします。

Note

api-versionを指定するときは、/discover応答のsupportedVersions配列 (現在は1.01.1、および1.2) の値のいずれかと完全に一致する必要があります。 その他の値 ( 1.15 などの中間値や、 1.0abc などの形式が正しくない値など) は、 400 Bad Request 応答を返します。 特定の Snipping Tool ビルドが受け入れるバージョンのセットを検出するには、 検出ホストを呼び出します。

Note

auto-save フラグは、ユーザーの切り取りツールの設定を考慮します。 ユーザーが Snipping Tool での自動保存を無効にした場合、要求に auto-saveが含まれている場合でも、キャプチャはデバイスに保存されません。

ホストの検出

discover ホストを使用して、実行時に Snipping Tool でサポートされている機能、モード、プロトコル バージョンに対してクエリを実行します。 これは、キャプチャ要求を行う前に互換性を確認する場合に便利です。

クエリ パラメーター (検出)

パラメーター タイプ 必須 Description デフォルト
redirect-uri URI イエス Snipping Tool が機能応答を送信するコールバック URI。 アプリでは、この URI スキームのプロトコル ハンドラーを登録する必要があります。 省略した場合、Snipping Tool は応答を返しません。 なし
user-agent 文字列 いいえ (強くお勧めします) ログ記録と分析に使用される呼び出し元アプリケーションの識別子。 なし
x-request-correlation-id 文字列 No 要求の一意識別子。 自動生成された GUID

発見の例

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

応答形式を検出する

応答は、 discover クエリ パラメーターとしてリダイレクト URI に追加された JSON オブジェクトです。 その構成要素を次に示します。

  • version: この Snipping Tool ビルドでサポートされている最新のプロトコル バージョン。
  • defaultVersion: 要求が api-versionを省略した場合に想定されるプロトコル バージョン。 これを読んで、ピン留めされていない要求がどのように解釈されるかを理解してください。
  • supportedVersions: この Snipping Tool ビルドで受け入れられるプロトコル バージョンの配列。
  • capabilities: サポートされているキャプチャ操作の配列。それぞれ次の操作が含まれます。
    • path: キャプチャ エンドポイント (たとえば、 capture/imagecapture/video)。
    • methods: サポートされている HTTP に似たメソッド。
    • parameters: エンドポイントで使用できるパラメーター。
    • description: 機能の説明。
{
  "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 パラメーターを使用すると、Snipping Tool UI で使用できるキャプチャ モードを制御できます。 これを使用して、アプリケーションの要件に合わせてユーザーの選択肢を制限または拡張します。

サポートされているモード

モード Description
RectangleSnip 四角形キャプチャ モード。
WindowSnip ウィンドウ キャプチャ モード。
FreeformSnip フリーフォーム キャプチャ モード。
FullscreenSnip 全画面表示キャプチャ モード。
SnippingAllModes すべてのイメージ キャプチャ モード: RectangleSnipWindowSnipFreeformSnipFullscreenSnip
RectangleRecord 矩形記録モード。
RecordAllModes すべての記録モード: 現在 RectangleRecord のみ。
All サポートされているすべてのモード: SnippingAllModesRecordAllModesの和集合。

Tip

AllSnippingAllModes、および RecordAllModes は集計値です。 含まれるモードは、切り取りツールのリリース間で変更される可能性があります。 これらの値のいずれかを使用するアプリは、今後のリリースで追加されたモードを自動的に選択します。 使用可能なモードのセットを更新間で固定したままにするには、特定のモードを明示的に一覧表示します (たとえば、 RectangleSnip,FreeformSnip)。

Important

  • /imageの場合、rectangleが指定されている場合でも、URI にはモード パラメーター (freeformwindowなど) がenabledModesです。 mode パラメーターは、最初に選択したモードを決定します。
  • URI で指定されたモードは、 enabledModesに一覧表示されていない場合でも、常に UI で使用できます。 たとえば、 ?freeform&enabledModes=RectangleSnip では、フリーフォーム (URI から) と四角形の切り取りの両方が使用可能になり、フリーフォームが事前に選択されています。
  • enabledModesを省略すると、URI で指定されたモードのみが UI で使用できるようになります。
  • /imageの場合、mode パラメーターが指定されていない場合、要求は無効であり、enabledModesに関係なくエラーが発生します。

EnabledModes の例

四角形の切り取りのみを有効にします。

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

四角形とウィンドウの切り取りを有効にする:

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

すべての切り取りモードを有効にします。

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

記録モードのみを有効にする:

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

複数の切り取りモードと録音モードを有効にします。

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

フリーフォームは URI で指定されているため、事前に選択されます。 ユーザーは、フリーフォーム、四角形の切り取り、および四角形の記録を切り替えることができます。

Responses

ユーザーがキャプチャを完了または取り消した後、Snipping Tool は redirect-uriを介して応答をアプリケーションに送信します。 応答は、リダイレクト URI に追加された URI クエリ パラメーターとして構成されます。

redirect-uriにクエリ パラメーター (my-app://response?sessionId=abc など) が既に含まれている場合、それらのパラメーターは保持され、応答パラメーターには&が追加されます。 これを使用すると、コールバックを介して呼び出し元固有の状態をラウンドトリップできます。 sessionId=abc 値は、 codereasonx-request-correlation-id、および (キャプチャを成功させるために) file-access-tokenと共に応答 URI にエコー バックされます。

応答パラメーター

パラメーター タイプ 現在 Description
code int いつも 結果を示す HTTP スタイルの状態コード。
reason 文字列 いつも 結果に関する人間が理解しやすい説明。
x-request-correlation-id 文字列 いつも 元の要求 (または自動生成された要求) からの関連付け ID。
file-access-token 文字列 成功のみ キャプチャされたメディアを表す SharedStorageAccessManager トークン。 これを使用してファイルを取得します。
discover 文字列 検出のみ 機能応答を含む URL エンコード JSON。

状態コード

Code 理由 Description
200 Success キャプチャが正常に完了しました。 file-access-tokenが応答に含まれます。
400 無効な要求 - 無効または不足しているパラメーター 要求を処理できませんでした。 必要なすべてのパラメーターが存在し、有効であることを確認します。
408 要求タイムアウト - 操作に時間がかかりすぎる 操作が完了する前にタイムアウトしました。
499 クライアントによる終了要求 - ユーザーが切り取りをキャンセルしました ユーザーが Escape キーを押すか、クリックしてキャプチャを取り消しました。 /image/videoにのみ適用されます。
500 内部サーバー エラー - 処理に失敗しました キャプチャ中に予期しないエラーが発生しました。

応答の例

成功したキャプチャ:

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

ユーザーが取り消されました:

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

要求が無効です (モード パラメーターがありません):

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

完全な URI の例

ユースケース(事例) URI Description
四角形のスクリーンショット ms-screenclip://capture/image?rectangle&user-agent=MyApp&redirect-uri=my-app://response 対話型の四角形キャプチャ。 呼び出し元に返される結果。
フリーフォームのスクリーンショット ms-screenclip://capture/image?freeform&user-agent=MyApp&redirect-uri=my-app://response 対話型のフリーフォーム キャプチャ。 呼び出し元に返される結果。
ウィンドウのスクリーンショット ms-screenclip://capture/image?window&user-agent=MyApp&redirect-uri=my-app://response 対話型ウィンドウ キャプチャ。 呼び出し元に返される結果。
画面記録 ms-screenclip://capture/video?user-agent=MyApp&redirect-uri=my-app://response 対話型の画面記録。 呼び出し元に返される結果。
機能を見つける ms-screenclip://discover?user-agent=MyApp&redirect-uri=my-app://response サポートされている機能のクエリを実行します。 呼び出し元に返されるJSON機能。
自動保存機能付きの四角形 ms-screenclip://capture/image?rectangle&auto-save&user-agent=MyApp&redirect-uri=my-app://response 自動保存を有効にした四角形キャプチャ。
すべてのモードを持つ四角形 ms-screenclip://capture/image?rectangle&enabledModes=All&user-agent=MyApp&redirect-uri=my-app://response 四角形キャプチャは、UI で使用できるすべてのモードで事前に選択されています。

アプリからの起動

Launcher.LaunchUriAsync を使用して、パッケージ アプリから Snipping Tool を起動する必要があります。 その他の起動方法 ( Process.Start やシェルの実行など) はアプリの ID を提供せず、Snipping Tool は応答を提供しません。

手順 1: プロトコル ハンドラーを登録する

アプリがコールバック応答を受信できるように、 Package.appxmanifest にカスタム プロトコルを登録します。 プロトコル名は、 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>

プロトコル のアクティブ化 の登録と処理の詳細については、URI のアクティブ化の処理に関するページを参照してください。

手順 2: 切り取りツールを起動する

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

手順 3: 応答を処理する

キャプチャが完了 (またはユーザーがキャンセル) すると、Snipping Tool は、クエリ文字列として追加された結果パラメーターを使用して、 redirect-uri を介してアプリをアクティブにします。 ほとんどの統合は、応答が到着したときに既に実行されています(呼び出し元が Snipping Tool を起動し、コールバックを待機しました)。そのため、アプリはコールドスタートのアクティブ化 (アプリが実行されていません) とウォーム再アクティブ化 (アプリが既に実行されています) の両方を処理する必要があります。 App.xaml.csの両方のパスをサブスクライブします。

キャプチャ応答 (画像またはビデオ) を処理します。

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

検出応答を処理します。

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

要求を含む x-request-correlation-id を送信した場合は、応答が同じ値をエコーすることを確認して、正しいインフライト要求に応答を一致させることができます。 Snipping Tool に自動生成を許可した場合、応答には生成された値が含まれます。これは、最新のインフライト要求と一致するものとして扱います。

トークンを使用してキャプチャされたメディアを取得する

SharedStorageAccessManager クラスを使用して、file-access-tokenを活用し、キャプチャされたファイルにアクセスします。

トークンの制限:

  • トークンは 1 回だけ引き換えることができます。 引き換え後は無効になります。
  • トークンは 14 日後に期限切れになります。
  • アプリに 1,000 個を超えるアクティブ トークンを含めることはできません。 トークンが引き換えられたり、削除されたり、期限切れになったりすると、クォータに対してカウントされなくなります。
// 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);

セキュリティの考慮事項

切り取りツールは、すべての redirect-uri 値を起動する前に検証します。 次の保護が適用されます。

  • パッケージ化されたアプリの呼び出し元: アプリがパッケージ化されたWindows アプリ (MSIX) である場合、オペレーティング システムはキャプチャ応答をアプリに安全にルーティングし、アプリのみが受信できるようにします。 これは推奨される統合パスです。
  • 入力検証: 切り取りツールは、UNC パス、先頭/末尾の空白文字、または制御文字を含むリダイレクト URI を拒否します。
  • フラグメントなし: URL フラグメント ( my-app://response#section など) を含むリダイレクト URI は拒否されます。 Snipping Tool は応答パラメーターをクエリ文字列として追加し、フラグメントはそれらを飲み込みます。
  • 自己参照保護: Snipping Tool の再帰的なアクティブ化を引き起こすリダイレクト URI はブロックされます。

Important

アプリケーションを呼び出す場合:

  • アプリが応答を受信できるように、リダイレクト URI スキームのプロトコル ハンドラーを登録します。
  • 応答で受信したすべてのパラメーターを検証してサニタイズしてから処理します。
  • 応答の x-request-correlation-id が、古い応答の処理や同時要求の混在を回避するために、処理中の要求と一致することを確認します。 Correlation-idは混乱を防ぎますが、トークンの出所は確立されません。セキュリティで保護されたトークンルーティングは、パッケージ化されたアプリのコールバックチャネルから行われます。