Cómo activar una aplicación (DirectX y C++)

En este tema se muestra cómo definir la experiencia de activación de una aplicación DirectX para la Plataforma universal de Windows (UWP).

Registrar el controlador de eventos de activación de la aplicación

Primero, haz un registro para controlar el evento CoreApplicationView::Activated, que se activa cuando el sistema operativo inicia e inicializa la aplicación.

Agrega este código a la implementación del método IFrameworkView::Initialize del proveedor de vistas (denominado MyViewProvider en el ejemplo):

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);
  
  //...

}

Activar la instancia de CoreWindow para la aplicación

Cuando se inicia la aplicación, debes obtener una referencia a CoreWindow para la aplicación. CoreWindow contiene el distribuidor de mensajes de eventos de ventana que la aplicación usa para procesar eventos de ventana. Obtén esta referencia en la devolución de llamada del evento de activación de la aplicación con una llamada a CoreWindow::GetForCurrentThread. Después de obtener esta referencia, activa la ventana de aplicación principal con una llamada a CoreWindow::Activate.

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

Iniciar el mensaje de evento de procesamiento para la ventana de aplicación principal

Las devoluciones de llamada se producen a medida que CoreDispatcher procesa los mensajes de eventos para el elemento CoreWindow de la aplicación. Esta devolución de llamada no se invocará si no llamas a CoreDispatcher::ProcessEvents desde el bucle principal de la aplicación (implementado en el método IFrameworkView::Run del proveedor de vistas).

// 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);
        }
    }
}