Condividi tramite


Gestire la trasmissione di giochi

Questo articolo illustra come gestire la trasmissione di giochi per un'app UWP. Gli utenti devono avviare la trasmissione usando l'interfaccia utente di sistema integrata in Windows, ma a partire da Windows 10 versione 1709, le app possono avviare l'interfaccia utente di trasmissione del sistema e possono ricevere notifiche all'avvio e all'arresto della trasmissione.

Aggiungere le estensioni desktop di Windows per la piattaforma UWP all'app

Le API per la gestione della trasmissione di app, disponibili nello spazio dei nomi Windows.Media.AppBroadcasting , non sono incluse nel contratto API universale. Per accedere alle API, devi aggiungere un riferimento alle estensioni desktop di Windows per la piattaforma UWP alla tua app seguendo questa procedura.

  1. In Visual Studio, in Esplora soluzioni, espandere il progetto UWP e fare clic con il pulsante destro del mouse su Riferimenti, quindi scegliere Aggiungi riferimento.
  2. Espandere il nodo Windows Universal e selezionare Estensioni.
  3. Nell'elenco delle estensioni selezionare la casella di controllo accanto alle estensioni desktop di Windows per la voce UWP corrispondente alla build di destinazione per il progetto. Per le funzionalità di trasmissione dell'app, la versione deve essere 1709 o successiva.
  4. Fare clic su OK.

Avviare l'interfaccia utente di sistema per consentire all'utente di avviare la trasmissione

Esistono diversi motivi per cui la tua app potrebbe non essere attualmente in grado di trasmettere, ad esempio se il dispositivo corrente non soddisfa i requisiti hardware per la trasmissione o se un'altra app sta attualmente trasmettendo. Prima di avviare l'interfaccia utente di sistema, è possibile verificare se l'app è attualmente in grado di trasmettere. Prima di tutto, verificare se le API di trasmissione sono disponibili nel dispositivo corrente. Le API non sono disponibili nei dispositivi che eseguono una versione del sistema operativo precedente a Windows 10, versione 1709. Anziché cercare una versione specifica del sistema operativo, usare il metodo ApiInformation.IsApiContractPresent per eseguire una query per Windows.Media.AppBroadcasting.AppBroadcastingContract versione 1.0. Se questo contratto è presente, le API di broadcasting sono disponibili nel dispositivo.

Ottenere quindi un'istanza della classe AppBroadcastingUI chiamando il metodo factory GetDefault nel PC, in cui è presente un singolo utente connesso alla volta. In Xbox, dove è possibile accedere a più utenti, chiamare invece GetForUser. Chiama quindi GetStatus per ottenere lo stato di trasmissione dell'app.

La proprietà CanStartBroadcast della classe AppBroadcastingStatus indica se l'app può attualmente avviare la trasmissione. In caso contrario, è possibile controllare la proprietà Details per determinare che la trasmissione del motivo non è disponibile. A seconda del motivo, può essere necessario mostrare lo stato all'utente o mostrare istruzioni per attivare il broadcasting.

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

Richiedere che l'interfaccia utente broadcast dell'app venga visualizzata dal sistema chiamando ShowBroadcastUI.

Nota

Il metodo ShowBroadcastUI rappresenta una richiesta che potrebbe non riuscire, a seconda dello stato corrente del sistema. L'app non deve presupporre che la trasmissione sia iniziata dopo aver chiamato questo metodo. Utilizzare l'evento IsCurrentAppBroadcastingChanged per ricevere una notifica all'avvio o all'arresto della trasmissione.

broadcastingUI->ShowBroadcastUI();

Ricevere notifiche all'avvio e all'arresto della trasmissione

Registra per ricevere notifiche quando l'utente usa l'interfaccia utente di sistema per avviare o interrompere la trasmissione dell'app inizializzando un'istanza della classe AppBroadcastingMonitor e registrando un gestore per l'evento IsCurrentAppBroadcastingChanged. Come descritto nella sezione precedente, assicurarsi di usare ApiInformation.IsApiContractPresent a un certo punto per verificare che le API di trasmissione siano presenti nel dispositivo prima di tentare di usarle.

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

Nel gestore per l'evento IsCurrentAppBroadcastingChanged puoi aggiornare l'interfaccia utente dell'app in modo da riflettere lo stato di trasmissione corrente.

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