2017-09-27 41 views
-1

与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

任何想法?谢谢。

+0

这是这个UWP示例的任务链,实际上您需要先阅读以下文章:https://docs.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming -in-cpp-universal-windows-platform-apps#创建一个任务链另一方面,你可以使用co_await来简化你的代码。这对你来说很容易使用。 –

回答

0

了解整个场景。有两件事你可以尝试。

您可以从此页学习https://docs.microsoft.com/en-us/windows/uwp/threading-async/asynchronous-programming-in-cpp-universal-windows-platform-apps#creating-a-chain-of-tasks以了解如何使用lambda和任务链创建异步操作 如果太复杂,可以考虑使用“co_await”作为替代方法。 这里有一些相关的信息:

  1. https://blogs.msdn.microsoft.com/vcblog/2016/04/04/using-c-coroutines-to-simplify-async-uwp-code/

  2. https://channel9.msdn.com/Events/Build/2016/P489

我创建了一个简单的测试代码,以简化整个screnario:

第1步:添加下面的头文件(然后添加/等待编译命令):

#include <pplawait.h> 
#include <experimental\resumable> 

步骤2:小鸡从Capbility抽头选择 “用户帐户信息” 中packagemanifest

步骤3:写在CPP下面的测试代码:

task<void> FindUserCPlusTest::MainPage::test() 
{ 
IVectorView<Windows::System::User ^> ^users = co_await User::FindAllAsync(); 
auto user = users->GetAt(0); 
auto name = co_await user->GetPropertyAsync(KnownUserProperties::DisplayName); 
auto displayname=safe_cast<String^>(name); 
} 

步骤4:编写以下代码.H

concurrency::task<void> test(); 

第5步:把你的方法在任何地方并调试它 调试时,你将能够看到默认用户的显示名称。你可以从这个简单的测试开始。

相关问题