与C#不同,似乎没有一种直接的方式来获取当前在C++中的UWP应用程序中登录的用户名。其中一项Xbox Live认证要求涉及获取这些信息并将其显示在主菜单上,而这款游戏在Windows 10之前就是用C++编写的,所以这是我在移植过程中遇到的挑战之一。如何使用C++/CX在UWP应用程序中查找当前用户的名称?
这是我为了完成任务而试图编写的功能。我得到的是一个空字符串。
int get_user_name(char* username)
{
auto users = User::FindAllAsync();
auto event1 = CreateEventEx(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
/* Wait for asynchronous procedure to finish */
for(;;)
{
if(users->Status == Windows::Foundation::AsyncStatus::Completed)
break;
WaitForSingleObjectEx(event1, 100, FALSE);
}
CloseHandle(event1);
auto results = users->GetResults();
if(results->Size < 1)
{
strcpy(username, "Nil");
return 1;
}
for(int i = 0; i < results->Size; i++)
{
User^ user = results->GetAt(i);
auto name = user->GetPropertyAsync(KnownUserProperties::DisplayName);
auto event2 = CreateEventEx(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
for(;;)
{
if(name->Status == Windows::Foundation::AsyncStatus::Completed)
break;
WaitForSingleObjectEx(event2, 100, FALSE);
}
CloseHandle(event2);
Platform::Object^ object = name->GetResults();
std::wstring wstr = object->ToString()->Data();
//setup converter
typedef std::codecvt_utf8<wchar_t> convert_type;
std::wstring_convert<convert_type, wchar_t> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_str = converter.to_bytes(wstr);
strcpy(username, converted_str.c_str());
}
return 1;
}
现在,我知道这不是写得最好的函数,但最重要的是让它暂时工作。
这是我能想到的绝对最好的方法,迄今为止Google的无数天都没有产生任何帮助,减去了我在GitHub上找到的非常复杂的C++示例(所有异步的东西都使它更容易混淆我):https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/UserInfo/cpp/Scenario1_FindUsers.xaml.cpp#L33
任何想法?谢谢。
这是这个UWP示例的任务链,实际上您需要先阅读以下文章:https://docs.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming -in-cpp-universal-windows-platform-apps#创建一个任务链另一方面,你可以使用co_await来简化你的代码。这对你来说很容易使用。 –