Поделиться через


Активация приложения (DirectX и C++)

В этом разделе показано, как определить возможности активации для приложения DirectX универсальной платформы Windows (UWP).

Регистрация обработчика событий активации приложения

Сначала зарегистрируйтесь для обработки события CoreApplicationView::Activated , которое возникает при запуске и инициализации приложения операционной системой.

Добавьте этот код в реализацию метода IFrameworkView::Initialize поставщика представлений (именованного MyViewProvider в примере):

void App::Initialize(CoreApplicationView^ applicationView)
{
    // Register event handlers for the app lifecycle. This example includes Activated, so that we
    // can make the CoreWindow active and start rendering on the window.
    applicationView->Activated +=
        ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &App::OnActivated);
  
  //...

}

Активация экземпляра CoreWindow для приложения

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

void App::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args)
{
    // Run() won't start until the CoreWindow is activated.
    CoreWindow::GetForCurrentThread()->Activate();
}

Начало обработки сообщения о событии для главного окна приложения

Ваши обратные вызовы происходят по мере того как сообщения о событиях обрабатываются CoreDispatcher для CoreWindowприложения. Этот обратный вызов не будет вызываться, если вы не используете CoreDispatcher::ProcessEvents в основном цикле вашего приложения (реализованного в методе IFrameworkView::Run вашего поставщика представлений).

// This method is called after the window becomes active.
void App::Run()
{
    while (!m_windowClosed)
    {
        if (m_windowVisible)
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

            m_main->Update();

            if (m_main->Render())
            {
                m_deviceResources->Present();
            }
        }
        else
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending);
        }
    }
}