无法在cppWinRT UWP应用中激活CoreWindow

时间:2018-08-26 23:20:04

标签: uwp c++-winrt

我有一个从“空白应用程序” Visual Studio模板创建的简单cppWinRT应用程序。我使用以下处理程序添加2个按钮:

Windows::Foundation::IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    OutputDebugStringW((L"\n Entered the function : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());

    coreView = winrt::Windows::ApplicationModel::Core::CoreApplication::CreateNewView();

    OutputDebugStringW((L"\n Created the view : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());

    co_await resume_foreground(coreView.Dispatcher());
    auto appView = winrt::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView();
    m_window_debug = Windows::UI::Core::CoreWindow::GetForCurrentThread();
    OutputDebugStringW((L"\n Switched thread : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());

    hstring newTitle = L"my new window";
    appView.Title(newTitle);
    OutputDebugStringW((L"\n Set new title : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());

    m_window_debug.Activated([&, this](auto&& sender, auto&& e) {
        OutputDebugStringW((L"\n sender ActivationMode : " + std::to_wstring(static_cast<int>(sender.ActivationMode())) + L"\n").c_str());
        OutputDebugStringW((L"\n sender ActivationState : " + std::to_wstring(static_cast<int>(e.WindowActivationState())) + L"\n").c_str());
    });

    OutputDebugStringW((L"\n Registered the callback : " + std::to_wstring(GetCurrentThreadId()) + L"\n").c_str());
}

Windows::Foundation::IAsyncAction MainPage::ClickHandler2(IInspectable const&, RoutedEventArgs const&)
{
    co_await resume_foreground(coreView.Dispatcher());
    Windows::UI::Core::CoreWindow::GetForCurrentThread().Activate();
    OutputDebugStringW((L"\n After activation : " + std::to_wstring(static_cast<int>(m_window_debug.ActivationMode())) + L"\n").c_str());

}

我希望当我单击button1并输入ClickHandler时,将创建一个新视图并准备将其激活,以便当我单击button2并输入ClickHandler2时,将激活我新创建的视图。并因此可见。

相反,发生的是视图没有改变,并且我在控制台中得到以下输出:

我点击Button1

Entered the function : 33084

Created the view : 33084

Switched thread : 8928

Set new title : 8928

Registered the callback : 8928

我点击Button2

After activation : 0

现在很奇怪的是,如果我在ClickHandlerClickHandler2的任何地方放置一个断点,然后按F10越过,然后按F5继续,它确实可以工作并具有新的视图在新标题中变得可见。输出看起来像这样:

我点击Button1

 Entered the function : 32432

 Window created : 5268

 Created the view : 32432

 Switched thread : 5268

 Set new title : 5268

 Registered the callback : 5268

我单击Button2,在ClickHandler2中的一行上断开,然后跳过并继续。

 After activation : 0

 sender ActivationMode : 3

 sender ActivationState : 0

 sender ActivationMode : 1

 sender ActivationState : 1

此时,新视图可见并且可以使用。

为什么要闯入代码才能使新视图可见?

1 个答案:

答案 0 :(得分:1)

作为winrt::resume_foreground的文档,该API的最低支持SDK:Windows SDK Insider Preview版本10.0.17661.0(Windows 10版本1803)。如果您在设备版本17134上使用SDK版本17134测试它,则它不是匹配的环境。

您可以在OS内部预览版本等于或高于17661的设备上测试项目,并将您的应用目标版本更改为相应的内部预览SDK版本。参见Windows Insider Preview Downloads。我尝试在操作系统版本为17746的设备上使用UWP应用程序目标版本17744(最低版本为17134)测试您的示例。