次の方法で共有


Windows でアプリ アクションの URI 起動を実装する

この記事では、アプリ アクションを作成する手順と、アプリ アクション プロバイダー アプリのコンポーネントについて説明します。 アプリ アクションは、Windows アプリが実装して登録できる個々の動作の単位であり、他のアプリやエクスペリエンスからアクセスしてユーザー ワークフローにシームレスに統合できるようにします。 Windows でのアプリ アクションの詳細については、「Windows での アプリアクションの概要」を参照してください。

アクション プロバイダー アプリは、COM のアクティブ化または URI 起動のアクティブ化を使用するように実装できます。 URI 起動アクションでは、コンテキストでの UI の表示やテキストの結果のストリーミングなど、いくつかの高度なアクション機能はサポートされていませんが、実装は非常に単純であり、1 つの要求と応答のみで構成されるアクションに最適な選択肢になる場合があります。

COM アクティブ化を使用するプロバイダー アプリは、アクションの呼び出しを処理するための IActionProvider インターフェイスを実装します。 このメソッドを使用すると、ストリーミング テキストのサポートなどの高度なアクション機能が有効になりますが、Windows アプリ アクション VSIX 拡張機能を使用するよりも多くのコードが必要です。 アプリ プロバイダーで COM ライセンス認証を使用する方法の詳細については、「 Windows でのアプリ アクションの概要」を参照してください。

  1. ターミナルで次のいずれかのコマンドを実行します (C# 開発者でも C++ 開発者でも)。 これにより、次のタスクを実行する WinGet 構成ファイル が実行されます (既にインストールされている依存関係はスキップされます)。

    • 開発者モードを有効にします。
    • Visual Studio Community Edition をインストールします
    • Windows アプリ開発ワークロードと、C++ または .NET/C# ワークロードを含める
    • MSIX パッケージ ツールを含める

C# 開発者の場合:

winget configure https://raw.githubusercontent.com/microsoft/winget-dsc/refs/heads/main/samples/Configuration%20files/Learn%20tutorials/Windows%20AI/app_actions_cs.winget

C++ 開発者の場合:

winget configure https://raw.githubusercontent.com/microsoft/winget-dsc/refs/heads/main/samples/Configuration%20files/Learn%20tutorials/Windows%20AI/app_actions_cpp.winget

Visual Studio で新しい Windows アプリ プロジェクトを作成する

アプリ アクション機能は、複数のアプリ フレームワークと言語でサポートされていますが、アプリをシステムに登録するにはパッケージ ID が必要です。 このチュートリアルでは、パッケージ化された C# WinUI 3 デスクトップ アプリに Windows アプリ アクション プロバイダーを実装します。

  1. Visual Studio で、新しいプロジェクトを作成します。

  2. [ 新しいプロジェクトの作成 ] ダイアログで、言語フィルターを "C#" に設定し、プラットフォーム フィルターを "WinUI" に設定し、"WinUI Blank App (Packaged)" プロジェクト テンプレートを選択します。

  3. 新しいプロジェクトに "ExampleAppActionProvider" という名前を付けます。

  4. プロジェクトが読み込まれたら、 ソリューション エクスプローラー でプロジェクト名を右クリックし、[ プロパティ] を選択します。 [ 全般 ] ページで、[ ターゲット OS ] まで下にスクロールし、[Windows] を選択します。 ターゲット OS のバージョンサポートされている OS バージョンの場合は、バージョン 10.0.26100.0 以降を選択します。

  5. アクション プロバイダー API をサポートするようにプロジェクトを更新するには、 ソリューション エクスプローラー でプロジェクト名を右クリックし、[ プロジェクト ファイルの編集] を選択します。 PropertyGroup 内に、次の WindowsSdkPackageVersion 要素を追加します。

    <WindowsSdkPackageVersion>10.0.26100.75</WindowsSdkPackageVersion>
    

Microsoft.AI.Actions nuget パッケージへの参照を追加する

Microsoft.AI.Actions nuget パッケージを使用すると、アプリ アクション ランタイムを初期化できます。これにより、アプリ アクションへの入力およびアプリ アクションからの出力として渡されるエンティティ オブジェクトを作成するための API が提供されます。

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックし、[NuGet パッケージの管理...] を選択します。
  2. [ 参照 ] タブで、Microsoft.AI.Actions を検索していることを確認します。
  3. Microsoft.AI.Actions を選択し、[インストール] をクリックします。

アクション定義 JSON ファイルを追加する

アクション プロバイダー アプリは、アプリが実装するアクションを定義するアクション定義ファイルを提供する必要があります。 このファイルには、各アクションの一意の識別子や説明、各アクションでサポートされる入力と出力の名前と種類などの情報が提供されます。 アプリ アクション JSON ファイル形式の詳細については、「 Windows アプリ アクション プロバイダーのアクション定義 JSON スキーマ」を参照してください。

この例では、 SendMessage という 1 つのアクションを定義します。このアクションは、単一 の Text エンティティを入力として受け取り、 単一の TextEntity を 出力として返します。 アクションの定義に加えて、JSON ファイルでは、アクション プロバイダー アプリを COM アクティブ化を使用して起動するか、URI 起動を使用して起動するかを指定します。 この例では、URI のアクティブ化を使用します。 URI スキームは、このチュートリアルの後の手順で登録します。

  1. ソリューション エクスプローラーでAssets フォルダーを右クリックし、[Add->New Item...] を選択します。
  2. [ 新しい項目の追加 ] ダイアログで、[ テキスト ファイル] を選択します。 新しいファイルに "registration.json" という名前を付け、[OK] をクリックします。
  3. ソリューション エクスプローラーで、registration.json ファイルを右クリックし、[プロパティ] を選択します[プロパティ] ウィンドウで、[ビルド アクション] を [コンテンツ] に設定し、[出力ディレクトリにコピー] を [新しい場合はコピー] に設定します。
  4. registration.json ファイルに次の JSON アクション定義を追加します。
{
  "version": 3,
  "actions": [
    {
      "id": "ExampleActionProvider.SendMessage",
      "description": "Send a message (URI Launch)",
      "icon": "ms-resource://Files/Assets/LockScreenLogo.png",
      "usesGenerativeAI": false,
      "allowedAppInvokers": ["*"],
      "inputs": [
        {
          "name": "message",
          "kind": "Text"
        }
      ],
      "inputCombinations": [
        {
          "inputs": [
            "message"
          ],
          "description": "Send message '${message.Text}'"
        }
      ],
      "outputs": [
        {
          "name": "response",
          "kind": "Text"
        }
      ],
      "invocation": {
        "type": "Uri",
        "uri": "urilaunchaction-protocol://",
        "inputData": {
          "message": "${message.Text}"
        }
      }
    }
  ]
}

アプリ パッケージ マニフェスト ファイルを更新する

Package.appmanifest ファイルは、アプリの MSIX パッケージの詳細を提供します。 システムが Windows アプリ アクション プロバイダーとして登録するには、アプリに、カテゴリが "windows.appExtension" に設定された uap3:Extension 要素を含める必要があります。 この要素は、アプリのアクションを定義する App Action JSON ファイルの場所を指定するために使用されます。 アクション プロバイダーのアプリ パッケージ マニフェスト形式の詳細については、「 Windows パッケージ マニフェスト XML 形式でのアプリ アクション」を参照してください。

アプリ アクション プロバイダーを URI 経由で起動するには、プロトコルをシステムに登録する必要があります。 この登録は、アプリ パッケージ マニフェストで com2:Extension 要素を指定することによって行われます。 Protocol 要素の Name 属性は、アクション定義 JSON ファイルで指定された invocation.uri 値と一致する必要があります。この例では、urilaunchaction-protocol。 URI 起動のアクティブ化の詳細については、 結果のアプリの起動に関するページを参照してください。

  1. Package.appxmanifest ファイルを右クリックし、[コードの表示] を選択します
  2. ファイルのルートにある Package 要素に次の名前空間を追加します。
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  1. Application 要素内と VisualElements 要素の後に、次の Extensions 要素を追加します。
<Extensions>
  <uap:Extension Category="windows.protocol">
    <uap:Protocol Name="urilaunchaction-protocol" ReturnResults="always">
      <!-- app-defined protocol name -->
      <uap:DisplayName>URI Launch Action Scheme</uap:DisplayName>
    </uap:Protocol>
  </uap:Extension>
  <uap3:Extension Category="windows.appExtension">
    <uap3:AppExtension Name="com.microsoft.windows.ai.actions" DisplayName="URILaunchAction" Id="UriLaunchActionId" PublicFolder="Assets">
      <uap3:Properties>
        <Registration xmlns="">registration.json</Registration>
      </uap3:Properties>
    </uap3:AppExtension>
  </uap3:Extension>
</Extensions>

アプリのアクティブ化を処理する

登録された URI スキーマからアプリ アクション プロバイダーを起動すると、AppInstance.GetActivatedEventArgs を呼び出すことによって取得された AppActivationArguments オブジェクトを介してアクションの入力にアクセスできます。 アクティブ化が登録済みのプロトコルから行われたかどうかを確認するには、まず Kind プロパティの値が ExtendedActivationKind.ProtocolForResults であることを確認する必要があります。 その場合は、引数オブジェクトを ProtocolForResultsActivatedEventArgs オブジェクトに キャストできます。

この例では、 ProtocolForResultsActivatedEventArgs オブジェクトを使用して、アクションが Windows によって呼び出されたことを確認し、アクションが別の呼び出し元によって起動されたかどうかを完了せずに終了します。 詳細については、「 Windows 上のアプリ アクションの呼び出し元を検出してフィルター処理する」を参照してください。

アクションの入力は、イベント引数の Data プロパティを介してアクセスされます。これは、各入力エンティティのキーと値のペアを含む ValueSet です。 この例では、registration.json ファイルで定義されている message 入力エンティティを取得します。 この入力の値はテキスト文字列です。

アクションの結果を返すには、アプリ アクション プロバイダーが 1 つ以上の出力エンティティをインスタンス化する必要があります。 次の使用例は、入力メッセージへの応答を含む単一の TextActionEntity を返します。

新しい出力エンティティをインスタンス化するには、ActionRuntime オブジェクトの EntityFactory プロパティから ActionEntityFactory クラスのインスタンスを取得します。 ファクトリ オブジェクトには、さまざまな種類のアクション エンティティをすべてインスタンス化するためのメソッドが用意されています。 応答メッセージを含むテキスト エンティティを作成した後、新しい ValueSet にエントリを作成します。ここで、キーは registrationl.json ファイルで指定された出力名 "response"、値は TextActionEntityID です。 CreateTextEntity を呼び出してエンティティを作成すると、エンティティはアクション ランタイムに登録されることに注意してください。 これが、エンティティの ID をValueSet の値として追加する理由です。 アクションのコンシューマーは、この ID を使用してアクション ランタイムからエンティティ オブジェクトを取得します。

URI アクティブ化を処理する最後の手順は、新しい ProtocolForResultsOperation を作成し、 ReportCompleted メソッドを呼び出して、出力エンティティ参照を含む ValueSet を 渡すことです。

App.xaml.csでは、 OnLaunched の既定の実装を次のコードに置き換えます。

  ProtocolForResultsOperation? _operation;
  protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
  {
      var eventargs = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();

      if ((eventargs != null) && (eventargs.Kind == ExtendedActivationKind.ProtocolForResults))
      {
          ProtocolForResultsActivatedEventArgs? protocolForResultsArgs = eventargs.Data as ProtocolForResultsActivatedEventArgs;
      
          if (protocolForResultsArgs.CallerPackageFamilyName.EndsWith("_cw5n1h2txyewy"))
          {
              using (ActionRuntime runtime = ActionRuntimeFactory.CreateActionRuntime())
              {
                  if (protocolForResultsArgs != null)
                  {
                      ValueSet inputData = protocolForResultsArgs.Data;
                      var message = inputData["message"];
      
                      Windows.AI.Actions.ActionEntityFactory source = runtime.EntityFactory;
                      Windows.AI.Actions.ActionEntity textEntity = source.CreateTextEntity("Message response.");
      
                      ValueSet result = new ValueSet();
                      result["response"] = textEntity.Id;
      
                      _operation = protocolForResultsArgs.ProtocolForResultsOperation;
                      _operation.ReportCompleted(result);
                  }
              }
          }
      }

      _window = new MainWindow();
      _window.Activate();
  }

Windows アプリ アクションをテストする

App Actions Testing Playground アプリを使用すると、Windows アプリ アクション プロバイダー アプリの登録と機能を検証できます。 このツールの使用方法の詳細については、「 アプリアクションテストプレイグラウンドアプリ」を参照してください。

Windows の機能に対するその他のアプリ アクション

次の記事では、Windows 上のアプリ アクションの追加機能について説明します。