取消注册以前注册的用户更改回调。
语法
bool XUserUnregisterForChangeEvent(
XTaskQueueRegistrationToken token,
bool wait
)
参数
token _In_
类型:XTaskQueueRegistrationToken
XUserRegisterForChangeEvent 返回的令牌,用于标识要取消注册的回调。
wait _In_
类型:bool
指示是否阻止直到完成所有挂起的回调。
返回值
类型:bool
如果 wait 为 false 且正在挂起取消注册,则返回 false。 否则返回 true。
备注
注意
在时间敏感线程上调用此函数是不安全的。 有关详细信息,请参阅时间敏感线程。
取消注册通知:
取消注册从注册的回调集中删除令牌的回调。
- 如果未对于回调令牌执行回调,则调用返回 true。
- 如果回调正在执行且 wait 为 true,调用将阻止直到完成执行的回调。
- 如果回调正在执行且 wait 为 false,调用将不阻止,但返回 false。 完成该令牌的回调后,自动取消注册令牌。
此机制允许以下编码模式:
- 您可以在取消注册时阻止,以确保在取消注册调用后从不调用您的回调。
- 您可以选择不阻止。 如果您需要确保在删除数据前完成您的回调,可以定期调用取消注册且使 wait 为 false。 当它最终返回 true 时,所有您的回调都已完成,且您可以删除状态。
- 如果取消注册调用不调用回调,您可以仅为 wait 传递 false 并忽略返回值。
要注册用户更改回调,请调用 XUserRegisterForChangeEvent。 XUserChangeEvent 枚举指定更改事件类型。 XUserChangeEventCallback 是用户更改事件的回调。
以下示例演示了如何处理用户更改事件。
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
库:xgameruntime.lib
支持的平台: Windows、Steam Deck、Xbox One 系列主机和 Xbox Series 主机