> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XUserAddOptions

> XUserAddOptions

# XUserAddOptions

Especifica as opções para adicionar um usuário.

## Sintaxe

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

## Constantes

| Constante | Descrição |
| - | - |
| None | Nenhuma opção. |
| AddDefaultUserSilently | Obtém o usuário que iniciou o jogo sem exibir nenhuma interface do usuário. |
| AllowGuests | Os convidados serão incluídos na interface do usuário do seletor de usuários. |
| AddDefaultUserAllowingUI | Tenta obter silenciosamente o usuário inicial que iniciou o jogo. Se o sistema puder obter esse usuário sem exibir nenhuma interface do usuário, ele tentará fazer isso. Se esse usuário precisar dar consentimento ou corrigir problemas de conta, a interface do usuário será exibida para resolver o problema. |

## Comentários

Há alguns casos extremos que os desenvolvedores devem conhecer se chamarem repetidamente
[XUserAddAsync](/pt-BR/reference/system/xuser/functions/xuseraddasync) com *options* definido como XUserAddOptions::AddDefaultUserSilently:

* Se você chamar isso repetidamente e soubermos qual é o usuário padrão que iniciou o jogo, o mesmo usuário será retornado.
* Se o usuário padrão conhecido anteriormente tiver saído e houver apenas um usuário conectado ao dispositivo, esse usuário
  será marcado como o novo usuário "padrão" e retornado.
* Se o usuário padrão conhecido anteriormente tiver saído e houver vários usuários conectados ao dispositivo, será
  retornado E\_GAMEUSER\_NO\_DEFAULT\_USER.
* Em inicializações de desenvolvedor, o usuário padrão será o usuário de entrada automática, que pode ser especificado definindo esse usuário como o usuário de entrada automática no DevHome ou usando [xbconfig (tópico sob NDA)](/pt-BR/tools/tools-console/commandlinetools/xbconfig) DefaultUser.

Se um usuário padrão não estiver disponível\*, [XUserAddResult](/pt-BR/reference/system/xuser/functions/xuseraddresult) retornará
E\_GAMEUSER\_NO\_DEFAULT\_USER. Você deve chamar [XUserAddAsync](/pt-BR/reference/system/xuser/functions/xuseraddasync) com *options* não definido como
XUserAddOptions::AddDefaultUserSilently.

Também há alguns casos extremos que os desenvolvedores devem conhecer se chamarem repetidamente
[XUserAddAsync](/pt-BR/reference/system/xuser/functions/xuseraddasync) com *options* definido como XUserAddOptions::AddDefaultUserAllowingUI. Eles são muito
semelhantes (mas não idênticos) ao caso silencioso:

* Se você chamar isso repetidamente e soubermos qual é o usuário padrão que iniciou o jogo, o mesmo usuário será retornado.
* Se o usuário padrão conhecido anteriormente tiver saído e houver apenas um usuário conectado ao dispositivo, esse usuário
  será marcado como o novo usuário "padrão" e retornado.
* Se o usuário que iniciou o jogo originalmente tiver saído e o número de usuários for 0 ou mais de 1,
  o sistema exibirá a interface do usuário para obter o usuário e, em seguida, definirá esse usuário como padrão.

Em [XUserAddAsync](/pt-BR/reference/system/xuser/functions/xuseraddasync), você não pode usar XUserAddOptions::AllowGuests com
XUserAddOptions::AddDefaultUserSilently. Um convidado não pode ser o usuário padrão.

Você pode usar XUserAddOptions::AllowGuests mesmo que a plataforma atual não ofereça suporte a convidados.

O exemplo a seguir demonstra como adicionar um usuário a uma sessão de jogo de forma assíncrona.

```cpp theme={null}
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;
}
```

## Requisitos

\
**Cabeçalho:** XUser.h

**Plataformas com suporte:** Windows, consoles da família XBOX One e consoles XBOX Series

## Confira também

[XUser](/pt-BR/reference/system/xuser/xuser_members)

[XUserAddAsync](/pt-BR/reference/system/xuser/functions/xuseraddasync)

[XUserAddResult](/pt-BR/reference/system/xuser/functions/xuseraddresult)


## Related topics

- [XUserAddOptions](/reference/system/xuser/enums/xuseraddoptions.md)
- [XUserAddResult](/reference/system/xuser/functions/xuseraddresult.md)
- [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync.md)
