> ## 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.

# XUserAddAsync

> XUserAddAsync

# XUserAddAsync

Ajoute de façon asynchrone un utilisateur à une session de jeu.

## Syntaxe

```cpp theme={null}
HRESULT XUserAddAsync(  
         XUserAddOptions options,  
         XAsyncBlock* async  
)  
```

### Paramètres

*options*   \_In\_\
Type : [XUserAddOptions](/fr/reference/system/xuser/enums/xuseraddoptions)

Options d'ajout d'un utilisateur à une session de jeu.

*async*   \_Inout\_\
Type : [XAsyncBlock\*](/fr/reference/system/xasync/structs/xasyncblock)

[XAsyncBlock](/fr/reference/system/xasync/structs/xasyncblock) permettant d'interroger l'état de l'appel et de récupérer les résultats de l'appel.

### Valeur de retour

Type : HRESULT

Code de réussite ou d'erreur HRESULT.
Pour obtenir la liste des codes d'erreur, consultez [Codes d'erreur](/fr/reference/errorcodes).

## Remarques

**XUserAddAsync** démarre une opération asynchrone pour ajouter un utilisateur au jeu. Utilisez
[XUserAddResult](/fr/reference/system/xuser/functions/xuseraddresult) pour récupérer les résultats de l'opération.

**XUserAddAsync** affiche toujours une interface utilisateur de sélection de compte, sauf si
[XUserAddOptions::AddDefaultUserSilently](/fr/reference/system/xuser/enums/xuseraddoptions) ou
[XUserAddOptions::AddDefaultUserAllowingUI](/fr/reference/system/xuser/enums/xuseraddoptions) est passé au paramètre *options*.

Si vous utilisez **XUserAddOptions::AddDefaultUserSilently**, **XUserAddAsync** n'affiche pas d'interface utilisateur.

Certaines considérations s'appliquent à cette fonction lors de l'utilisation du [modèle utilisateur simplifié (rubrique sous NDA)](/fr/build/core-features/common/user/gamecore-user-models) :

* Avec le modèle utilisateur simplifié, les développeurs doivent s'assurer que *options* est défini sur
  **XUserAddOptions::AddDefaultUserSilently** :
* Sur console, les jeux déployés de manière libre (loose) qui utilisent le modèle utilisateur simplifié ne peuvent pas
  être lancés si aucun utilisateur par défaut n'est déjà connecté.
* Sur PC, les jeux déployés de manière libre (loose) qui utilisent le modèle utilisateur simplifié peuvent être lancés sans utilisateur ;
  toutefois, lorsque le jeu appelle **XUserAddAsync**, si personne n'est connecté, le jeu
  est arrêté et le programme d'amorçage PC (PC Bootstrapper) est lancé pour aider un utilisateur à se connecter. Les lancements
  suivants fonctionnent normalement tant que l'utilisateur est entièrement connecté à XBOX Live.

Il existe certains cas limites que les développeurs doivent connaître s'ils appellent de manière répétée
**XUserAddAsync** avec *options* défini sur **XUserAddOptions::AddDefaultUserSilently** :

* Si vous appelez cette fonction de manière répétée et que l'utilisateur par défaut qui a lancé le jeu est connu, elle retourne ce même utilisateur.
* Si l'utilisateur par défaut précédemment connu s'est déconnecté et qu'un seul utilisateur est connecté sur l'appareil, elle
  marque cet utilisateur comme nouvel utilisateur « par défaut » et le retourne.
* Si l'utilisateur par défaut précédemment connu s'est déconnecté et que plusieurs utilisateurs sont connectés sur l'appareil, elle
  retourne E\_GAMEUSER\_NO\_DEFAULT\_USER.

Si aucun utilisateur par défaut n'est disponible, [XUserAddResult](/fr/reference/system/xuser/functions/xuseraddresult) retourne
E\_GAMEUSER\_NO\_DEFAULT\_USER. Vous devez appeler **XUserAddAsync** avec *options* non défini sur
**XUserAddOptions::AddDefaultUserSilently**.

Il existe également certains cas limites que les développeurs doivent connaître s'ils appellent de manière répétée
**XUserAddAsync** avec *options* défini sur **XUserAddOptions::AddDefaultUserAllowingUI**. Ils sont très
semblables (mais pas identiques) au cas silencieux :

* Si vous appelez cette fonction de manière répétée et que l'utilisateur par défaut qui a lancé le jeu est connu, elle retourne ce même utilisateur.
* Si l'utilisateur par défaut précédemment connu s'est déconnecté et qu'un seul utilisateur est connecté sur l'appareil, elle marque cet utilisateur comme nouvel utilisateur « par défaut » et le retourne.
* Si l'utilisateur qui a initialement lancé le jeu s'est déconnecté et que le nombre d'utilisateurs est égal à 0 ou supérieur à 1, le système affiche une interface utilisateur pour obtenir l'utilisateur, puis définit cet utilisateur comme utilisateur par défaut.

Vous ne pouvez pas utiliser [XUserAddOptions::AllowGuests](/fr/reference/system/xuser/enums/xuseraddoptions) avec
**XUserAddOptions::AddDefaultUserSilently**. Un invité ne peut pas être l'utilisateur par défaut. Vous pouvez utiliser
**XUserAddOptions::AllowGuests** en toute sécurité, que la plateforme actuelle prenne en charge les invités ou non.

Vous devez fermer une seule fois chaque handle **XUserHandle** que vous récupérez à partir d'une API **XUsers** en appelant
[XUserCloseHandle](/fr/reference/system/xuser/functions/xuserclosehandle).

L'appairage des périphériques d'entrée est effectué une fois **XUserAddAsync** terminé avec succès. Si la connexion s'est produite automatiquement sans interface utilisateur en raison des options **XUserAddOptions::AddDefaultUserSilently** ou **XUserAddOptions::AddDefaultUserAllowingUI**, les périphériques d'entrée attribués à l'utilisateur dans le système sont propagés au titre. Si l'interface utilisateur a été affichée pour la connexion, le périphérique d'entrée qui a sélectionné l'utilisateur est attribué à cet utilisateur.

L'association des appareils peut être suivie à l'aide de la méthode [XUserRegisterForDeviceAssociationChanged](/fr/reference/system/xuser/functions/xuserregisterfordeviceassociationchanged).

L'exemple suivant montre comment ajouter de façon asynchrone un utilisateur à une session de jeu.

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

## Configuration requise

**En-tête :** XUser.h

**Bibliothèque :** xgameruntime.lib

**Plateformes prises en charge :** Windows, Steam Deck, consoles de la famille XBOX One et consoles XBOX Series

## Documentation conceptuelle

* [Exécuter une tâche d'API Microsoft Game Development Kit (GDK)](/fr/build/core-features/common/async/async-libraries/async-library-xasync-example-run-gdk-task)
* [Objectifs de conception et améliorations de la programmation asynchrone](/fr/build/core-features/common/async/async-whitepaper)
* [Implémenter la connexion des joueurs dans votre jeu](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/pc-dev/tutorials/pc-e2e-guide/e2e-services/e2e-user-sign-in)
* [Présentation de Game Chat 2](/fr/services/xbox-services/multiplayer/chat/game-chat2/game-chat-2-intro)
* [Utilisation de l'API C++ Game Chat 2](/fr/services/xbox-services/multiplayer/chat/game-chat2/using-game-chat-2)
* [Implémenter la connexion des joueurs](/fr/services/xbox-services/playfab-integration)

## Voir aussi

[XUser](/fr/reference/system/xuser/xuser_members)

[XUserAddOptions](/fr/reference/system/xuser/enums/xuseraddoptions)

[XUserCloseHandle](/fr/reference/system/xuser/functions/xuserclosehandle)


## Related topics

- [XUserAddAsync](/reference/system/xuser/functions/xuseraddasync.md)
- [User identity and XUser](/build/core-features/common/user/player-identity-xuser.md)
- [XUserAddResult](/reference/system/xuser/functions/xuseraddresult.md)
- [XUserAddOptions](/reference/system/xuser/enums/xuseraddoptions.md)
- [Unity C# API wrappers for the GDK](/build/gdk-and-engines/unity/unity-api-wrappers.md)
