次の方法で共有


ゲームのブロードキャストを管理する

この記事では、UWP アプリのゲームのブロードキャストを管理する方法を示します。 ユーザーは、Windows に組み込まれているシステム UI を使用してゲームのブロードキャストを開始する必要がありますが、Windows 10 バージョン 1709 以降、アプリでシステムのブロードキャスト UI を起動でき、ブロードキャストが開始および停止されたときには通知を受信できます。

UWP 用の Windows デスクトップ拡張機能をアプリに追加する

アプリのブロードキャストを管理するための API は、Windows.Media.AppBroadcasting 名前空間にあり、ユニバーサル API コントラクトに含まれていません。 この API にアクセスするには、次の手順に従って、UWP 用の Windows デスクトップ拡張機能への参照をアプリに追加する必要があります。

  1. Visual Studio のソリューション エクスプローラーで、UWP プロジェクトを展開し、[参照] を右クリックして、[参照の追加] を選択します。
  2. [ユニバーサル Windows] ノードを展開し、[拡張機能] を選択します。
  3. 拡張機能の一覧で、プロジェクトのターゲット ビルドに一致する [Windows Desktop Extensions for the UWP] エントリの横にあるチェック ボックスをオンにします。 アプリのブロードキャスト機能を使用するには、バージョンが 1709 以上である必要があります。
  4. [OK] をクリックします。

システム UI を起動して、ユーザーがブロードキャストを開始できるようにします。

現在、アプリでブロードキャストできない場合は、いくつかの原因があります。たとえば、現在のデバイスがブロードキャストのハードウェア要件を満たしていない場合や、別のアプリが現在ブロードキャストしている場合です。 システム UI を起動する前に、アプリが現在ブロードキャストできるかどうかを確認できます。 最初に、ブロードキャスト API が現在のデバイスで利用可能かどうかを確認します。 この API は、Windows 10 バージョン 1709 より前のバージョンの OS を実行しているデバイスでは利用できません。 特定の OS バージョンを確認するのではなく、ApiInformation.IsApiContractPresent メソッドで、Windows.Media.AppBroadcasting.AppBroadcastingContract バージョン 1.0 を照会します。 このコントラクトが存在する場合は、デバイスでブロードキャスト API を利用できます。

次に、一度に 1 人のユーザーがサインインしている PC で、ファクトリ メソッド GetDefault を呼び出すことによって、AppBroadcastingUI クラスのインスタンスを取得します。 複数のユーザーがログインできる Xbox では、代わりに GetForUser を呼び出します。 次に、GetStatus を呼び出して、アプリのブロードキャストの状態を取得します。

AppBroadcastingStatus クラスの CanStartBroadcast プロパティは、アプリが現在ブロードキャストを開始できるかどうかを通知します。 開始できない場合は、Details プロパティを調べて、ブロードキャストを利用できない理由を確認できます。 理由に応じて、ユーザーに対してステータスを表示したり、ブロードキャストを有効にするための手順を示したりすることができます。

// Verify that the edition supports the AppBroadcasting APIs
if (!Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent(
    "Windows.Media.AppBroadcasting.AppBroadcastingContract", 1, 0))
{
    return;
}

// On PC, call GetDefault because there is a single user signed in.
// On Xbox, call GetForUser instead because multiple users can be signed in.
AppBroadcastingUI^ broadcastingUI = AppBroadcastingUI::GetDefault();
AppBroadcastingStatus^ broadcastingStatus = broadcastingUI->GetStatus();

if (!broadcastingStatus->CanStartBroadcast)
{
    AppBroadcastingStatusDetails^ details = broadcastingStatus->Details;

    if (details->IsAnyAppBroadcasting)
    {
        UpdateStatusText("Another app is currently broadcasting.");
        return;
    }

    if (details->IsCaptureResourceUnavailable)
    {
        UpdateStatusText("The capture resource is currently unavailable.");
        return;
    }

    if (details->IsGameStreamInProgress)
    {
        UpdateStatusText("A game stream is currently in progress.");
        return;
    }

    if (details->IsGpuConstrained)
    {
        // Typically, this means that the GPU software does not include an H264 encoder
        UpdateStatusText("The GPU does not support broadcasting.");
        return;
    }

    // Broadcasting can only be started when the application's window is the active window.
    if (details->IsAppInactive)
    {
        UpdateStatusText("The app window to be broadcast is not active.");
        return;
    }

    if (details->IsBlockedForApp)
    {
        UpdateStatusText("Broadcasting is blocked for this app.");
        return;
    }

    if (details->IsDisabledByUser)
    {
        UpdateStatusText("The user has disabled GameBar in Windows Settings.");
        return;
    }

    if (details->IsDisabledBySystem)
    {
        UpdateStatusText("Broadcasting is disabled by the system.");
        return;
    }
    return;
}

ShowBroadcastUI を呼び出すことによって、アプリのブロードキャスト UI をシステムで表示することを要求します。

注意

ShowBroadcastUI メソッドは、システムの現在の状態に応じて、成功しない可能性がある要求を示します。 アプリでは、このメソッドを呼び出した後、ブロードキャストが開始済みであることを想定しないでください。 ブロードキャストが開始または停止するときに通知される IsCurrentAppBroadcastingChanged イベントを使用します。

broadcastingUI->ShowBroadcastUI();

ブロードキャストが開始および停止するときに通知を受信する

AppBroadcastingMonitor クラスのインスタンスを初期化し、IsCurrentAppBroadcastingChanged イベントのハンドラーを登録することによって、ユーザーがシステム UI を使用してアプリのブロードキャストを開始または停止するときに通知を受信することを登録します。 前のセクションで説明したように、必ずある時点で ApiInformation.IsApiContractPresent を使用して、ブロードキャスト API を使用する前に、デバイスにブロードキャスト API が存在することを確認します。

if (Windows::Foundation::Metadata::ApiInformation::IsApiContractPresent(
    "Windows.Media.AppBroadcasting.AppBroadcastingContract", 1, 0))
{
    m_appBroadcastMonitor = ref new AppBroadcastingMonitor();

    m_appBroadcastMonitor->IsCurrentAppBroadcastingChanged +=
        ref new TypedEventHandler<AppBroadcastingMonitor^, Platform::Object^>(this, &App::OnIsCurrentAppBroadcastingChanged);
}

IsCurrentAppBroadcastingChanged イベントのハンドラーで、現在のブロードキャストの状態を反映するように、アプリの UI を更新することもできます。

void App::OnIsCurrentAppBroadcastingChanged(AppBroadcastingMonitor^ sender, Platform::Object^ args)
{
    if (sender->IsCurrentAppBroadcasting)
    {
        UpdateStatusText("App started broadcasting.");
    }
    else
    {
        UpdateStatusText("App stopped broadcasting.");
    }
}