次の方法で共有


XUserAddOptions

ユーザーを追加するオプションを指定します。

構文

enum class XUserAddOptions  : uint32_t  
{  
    None = 0x00,  
    AddDefaultUserSilently = 0x01,  
    AllowGuests = 0x02,  
    AddDefaultUserAllowingUI = 0x04,
}  

定数

定数 説明
None オプションはありません。
AddDefaultUserSilently UI をポップアップ表示せずに、ゲームを開始したユーザーを取得します。
AllowGuests ゲストは、ユーザー ピッカー UI に含まれます。
AddDefaultUserAllowingUI ゲームを暗黙的に開始した初期ユーザーを取得しようとします。 システムが UI をポップアップ表示せずにそのユーザーを取得できる場合は、そのようにします。 そのユーザーが同意したり、アカウントの問題を修正したりする必要がある場合は、問題を解決するために UI が表示されます。

解説

オプションを XUserAddOptions::AddDefaultUserSilently に設定して XUserAddAsync を繰り返し呼び出すかどうかについて、開発者が知っておくべきいくつかのエッジ ケースがあります。

  • これを繰り返し呼び出し、ゲームを開始した既定のユーザーがわかっている場合は、その同じユーザーを返します。
  • 以前にわかっていた既定のユーザーがサインアウトして、デバイスにサインインしているユーザーが 1 人だけである場合、そのユーザーを新しい「既定の」ユーザーとしてマークし、そのユーザーを返します。
  • 以前に認識されていた既定のユーザーがサインアウトして、複数のユーザーがデバイスにサインインした場合、E_GAMEUSER_NO_DEFAULT_USER を返します。
  • 開発者向けには、既定のユーザーは自動サインイン ユーザーです。このユーザーは、DevHome の自動サインイン ユーザーとして設定するか、xbconfig (NDA トピック)認可が必須です の DefaultUser を使用して指定できます。

既定のユーザーが使用できない場合*、XUserAddResult は E_GAMEUSER_NO_DEFAULT_USER を返します。 オプションを XUserAddOptions::AddDefaultUserSilently に設定せずに XUserAddAsync を呼び出す必要があります。

オプションを XUserAddOptions::AddDefaultUserAllowingUI に設定して XUserAddAsync を繰り返し呼び出すかどうかについても、開発者が知っておくべきいくつかのエッジ ケースがあります。 これらは、暗黙的な UI の場合とよく似ています (ただし同じではありません)。

  • これを繰り返し呼び出し、ゲームを開始した既定のユーザーがわかっている場合は、その同じユーザーを返します。
  • 以前にわかっていた既定のユーザーがサインアウトして、デバイスにサインインしているユーザーが 1 人だけである場合、そのユーザーを新しい「既定の」ユーザーとしてマークし、そのユーザーを返します。
  • ユーザーが最初にゲームを開始したユーザーをサインアウトして、ユーザー数が 0 または 2 以上の場合、システムはユーザーを取得するための UI を表示し、そのユーザーを既定として設定します。

XUserAddAsync で、XUserAddOptions::AllowGuests を XUserAddOptions::AddDefaultUserSilently とともに使用することはできません。 ゲストを既定ユーザーにすることはできません。

現在のプラットフォームでゲストがサポートされていない場合でも、XUserAddOptions:: AllowGuests を使用できます。

次の例は、非同期的にユーザーをゲーム セッションに追加する方法を示しています。

HRESULT AddUserComplete(XAsyncBlock* ab)
{
    unique_user_handle user;
    RETURN_IF_FAILED(XUserAddResult(ab, &user));

    XUserLocalId userLocalId;
    XUserGetLocalId(user.get(), &userLocalId);

    auto iter = std::find_if(
        _users.begin(),
        _users.end(),
        [&userLocalId](const User& candidate)
    {
        XUserLocalId candidateUserLocalId;
        XUserGetLocalId(candidate.Handle(), &candidateUserLocalId);
        return candidateUserLocalId == userLocalId;
    });

    // User already known
    if (iter != _users.end())
    {
        appLog.AddLog("User already in list\n");
        return S_OK;
    }

    try
    {
        _users.emplace_back(user.get());
        _users.back().LoadGamerPicAsync(_queue);
    }
    CATCH_RETURN();

    return S_OK;
}

HRESULT AddUser(bool allowGuests, bool silent)
{
    auto asyncBlock = std::make_unique<XAsyncBlock>();
    ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
    asyncBlock->queue = _queue;
    asyncBlock->context = this;
    asyncBlock->callback = [](XAsyncBlock* ab)
    {
        auto asyncBlock = std::unique_ptr<XAsyncBlock>(ab);
        LOG_IF_FAILED(static_cast<UserWindow*>(ab->context)->AddUserComplete(ab));
    };

    XUserAddOptions options = XUserAddOptions::None;

    if (allowGuests)
    {
        WI_SET_FLAG(options, XUserAddOptions::AllowGuests);
    }

    if (silent)
    {
        WI_SET_FLAG(options, XUserAddOptions::AddDefaultUserSilently);
    }

    if (SUCCEEDED_LOG(XUserAddAsync(
        options,
        asyncBlock.get())))
    {
        // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
        // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
        asyncBlock.release();
    }

    return S_OK;
}

要件

ヘッダー: XUser.h

サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体

関連項目

XUser

XUserAddAsync

XUserAddResult