次の方法で共有


XUserChangeEvent

ユーザー変更イベントの種類を指定します。

構文

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

定数

定数 説明
SignedInAgain ユーザーが再度サインインします。 これは、ユーザーがサインアウトして、もう一度サインインした後、ゲームが XUserHandle を保持している場合にのみ発生します。
SigningOut ユーザーがサインアウトします。
SignedOut ユーザーがサインアウトしました。
Gamertag ユーザーのゲーマータグが変更されました。
GamerPicture ユーザーのゲーマー アイコンが変更されました。
権限 ユーザーの権限が変更されました。

解説

ユーザーの状態またはユーザーの情報の変更を監視するには、XUserChangeEvent をサブスクライブします。 XUserChangeEvent イベントをサブスクライブするには、XUserRegisterForChangeEvent 関数を呼び出します。 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