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