XUserChangeEvent

指定用户更改事件的类型。

语法

enum class XUserChangeEvent  : uint32_t  
{  
    SignedInAgain = 0,  
    SigningOut = 1,  
    SignedOut = 2,  
    Gamertag = 3,  
    GamerPicture = 4,  
    Privileges = 5,  
}  

常量

常量 说明
SignedInAgain 用户再次登录。 仅当用户注销后游戏保持在 XUserHandle 上,然后该用户再次登录时,才会发生这种情况。
SigningOut 正在注销用户。
SignedOut 用户已注销。
玩家代号 用户的玩家代号已更改。
GamerPicture 用户的玩家图片已更改。
权限 用户的权限已更改。

备注

要监视用户状态或用户信息的更改,请订阅 XUserChangeEvent。 调用 XUserRegisterForChangeEvent 函数来订阅 XUserChangeEvent。 XUserRegisterForChangeEvent 函数接受指向 XUserChangeEventCallback 回调参数的指针。 此函数返回指向回调的指针。 XUserChangeEventCallback 回调采用 XUserChangeEvent 枚举作为参数。

以下示例演示了如何处理用户更改事件。

HRESULT RegisterForChanges()
{
    RETURN_HR_IF(E_UNEXPECTED, _token.token != 0);
    RETURN_IF_FAILED(XUserRegisterForChangeEvent(
        _queue,
        this,
        UserChangeEventHandler,
        &_token));
    return S_OK;
}

void UnregisterForChanges()
{
    XUserUnregisterForChangeEvent(_token, false);
    _token.token = 0;
}

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

    // User not known
    if (iter == _users.end())
    {
        return;
    }

    auto handle = iter->Handle();

    // If a guest gets signed out, immediately close the handle
    bool isGuest;
    if (SUCCEEDED_LOG(XUserGetIsGuest(handle, &isGuest)) &&
        isGuest &&
        event == XUserChangeEvent::SignedOut)
    {
        _users.erase(iter);
    }

    if (event == XUserChangeEvent::SigningOut)
    {
        // Delay the user signing out just for fun
        XUserSignOutDeferralHandle deferral;
        if (SUCCEEDED_LOG(XUserGetSignOutDeferral(&deferral)))
        {
            // Hold the deferral for 5 seconds then close it
            std::thread completeDeferralThread(
                [deferral]()
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(5000));
                XUserCloseSignOutDeferralHandle(deferral);
            });

            completeDeferralThread.detach();
        }
    }

    if (event == XUserChangeEvent::GamerPicture)
    {
        iter->LoadGamerPicAsync(_queue);
    }
}

要求

头文件:XUser.h

支持平台:Windows、Xbox One 系列主机和 Xbox Series 主机

另请参阅

XUser

XUserRegisterForChangeEvent

XUserChangeEventCallback