Nano Hash - криптовалюты, майнинг, программирование

Не удается активировать CoreWindow в приложении cppWinRT UWP

У меня есть простое приложение 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());

}

Я ожидаю, что, когда я нажму кнопку 1 и введу ClickHandler, новое представление будет создано и готово к активации, так что, когда я нажму кнопку 2 и введу ClickHandler2, мое вновь созданное представление активируется и, таким образом, станет видимым.

Вместо этого происходит то, что представление не меняется, и я получаю следующий вывод в консоли:

Я нажимаю кнопку 1

Entered the function : 33084

Created the view : 33084

Switched thread : 8928

Set new title : 8928

Registered the callback : 8928

Я нажимаю кнопку 2

After activation : 0

Странно то, что если я помещаю точку останова где-нибудь в ClickHandler или ClickHandler2, а затем нажимаю F10 для перехода, а затем F5 для продолжения, это действительно работает, и новое представление становится видимым с новым заголовком. Результат выглядит так:

Я нажимаю кнопку 1

 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

На этом этапе виден новый вид, и он работает.

Почему мне нужно взломать код, чтобы мое новое представление стало видимым?

26.08.2018

  • Какая у вас целевая версия приложения? Не могли бы вы предоставить простой образец проекта, который поможет мне разобраться в этой проблеме? 29.08.2018
  • Вот пример, демонстрирующий ту же проблему: github.com/maximebl/so_repro 29.08.2018

Ответы:


1

Как документ winrt :: resume_foreground минимально поддерживаемый SDK этого API: Windows SDK Insider Preview версии 10.0.17661.0 (Windows 10, версия 1803). Если вы протестируете его с помощью SDK версии 17134 на устройстве версии 17134, это не подходящая среда.

Вы можете протестировать свой проект на устройстве с версией предварительной версии ОС, равной или более высокой, чем 17661, и изменить целевую версию своего приложения на соответствующую версию SDK предварительной версии внутренней программы. См. Загрузки Windows Insider Preview. Я попытался протестировать ваш образец с целевой версией приложения UWP 17744, минимальной версией 17134 на устройстве с версией ОС 17746, он работает хорошо.

30.08.2018
  • Спасибо за информацию! Я получил эту предварительную сборку, и мне удалось скомпилировать и запустить приложение (я говорю о приложении под названием so_repro, которое я связал в своем последнем комментарии). Это правда, что он показывает окно, когда вы нажимаете кнопку, однако обратите внимание, что окно не активировано (отсюда и название этого вопроса). Я пробовал вручную активировать его с помощью Window :: Current (). CoreWindow (). Activate (), но он все еще не активирует его. С тех пор я понял, что мне нужно добавить элемент Xaml Frame в окно, чтобы оно активировалось, потому что это приложение xaml. 31.08.2018
  • Добавление кадра Xaml в представление на самом деле вызывает очень специфическую проблему для моего варианта использования, потому что я хочу использовать CoreWindow для создания цепочки подкачки DirectX. И оказывается, что если я добавлю к нему Xaml-фрейм, вызов IDXGIFactory2 :: CreateSwapChainForCoreWindow завершится с ошибкой отказа в доступе. Итак, теперь вопрос в том, как я могу активировать новое представление БЕЗ добавления к нему фрейма xaml. 31.08.2018
  • Вы можете попробовать добавить фрейм, а затем поставить SwapChainPanel во фрейм. SwapChainPanel предоставляет поверхность для размещения , где цепочки подкачки Microsoft DirectX предоставляют контент, который можно отобразить в пользовательском интерфейсе XAML. См. Также код из примера взаимодействия XAML SwapChainPanel DirectX. 31.08.2018
  • Да, это именно то, что я уже делал :) Загвоздка в том, что мне абсолютно необходимо второе окно просмотра, которое использует CreateSwapchainForComposition с CoreWindow, потому что отладчик nvidia nsight для Visual Studio работает только с ним. 31.08.2018
  • У меня есть отдельный вопрос, который более подробно объясняет то, что я только что сказал в своем комментарии: stackoverflow.com/questions/51807703/ 31.08.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..