Para monitorar alterações no estado ou nas informações do usuário, assine XUserChangeEvent.
Chame a função XUserRegisterForChangeEvent para assinar XUserChangeEvent.
A função XUserRegisterForChangeEvent aceita um ponteiro para um argumento de retorno de chamada XUserChangeEventCallback. A função retorna o ponteiro para o retorno de chamada.
O retorno de chamada XUserChangeEventCallback usa uma enumeração XUserChangeEvent como argumento.O exemplo a seguir demonstra como lidar com eventos de alteração do usuário.
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); }}