Como ativar um aplicativo (DirectX e C++)

Applies to Windows and Windows Phone

Este tópico mostra como definir a experiência de ativação para o aplicativo do Tempo de Execução do Windows em DirectX com C++.

Registrar o manipulador de eventos de ativação de aplicativo

Primeiro, registre para manipular o evento CoreApplicationView::Activated, que é acionado quando seu aplicativo é iniciado e inicializado pelo sistema operacional.

  • Applies to Windows Phone

Observação  No Windows Phone, esse método é chamado cada vez que o usuário inicia o aplicativo do bloco Iniciar ou da lista de aplicativos, mesmo quando o aplicativo está suspenso na memória. Os aplicativos devem verificar os parâmetros de ativação e decidirem se continuam com a experiência anterior ou apresentam uma nova tela quando iniciarem com novos parâmetros.

Adicione este código a sua implementação do método IFrameworkView::Initialize de seu provedor de visualização (nomeado MyViewProvider no exemplo):



using namespace concurrency;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::UI::Core;
using namespace Windows::UI::ViewManagement;

MyViewProvider::MyViewProvider() :
    // class fields
    // ...
    bool m_visible;
    bool m_windowsClosed;
{

}

void MyViewProvider::Initialize(
    _In_ CoreApplicationView^ applicationView
    )
{

   // ...

    applicationView->Activated +=
        ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &DirectXApp::OnActivated);

   // ...

}


Ativar a instancia do CoreWindow para o aplicativo

Quando seu aplicativo inicia, você deve obter uma referencia para o CoreWindow para o aplicativo. O CoreWindow inclui o dispatcher de mensagem de eventos da janela que seu aplicativo usa para processar os eventos da janela. Obtenha essa referência no retorno de chamada do evento de ativação do aplicativo chamando CoreWindow::GetForCurrentThread. Depois de obter essa referência, faça o seguinte:

  • Crie e vincule um manipulador de eventos para o evento de ativação da janela do aplicativo principal, CoreWindow::Activated. Esse evento é disparado quando a janela do aplicativo principal ganha ou perde foco.
  • Ative a janela do aplicativo principal chamando CoreWindow::Activate.


void MyViewProvider::OnActivated(
    _In_ CoreApplicationView^ /* applicationView */,
    _In_ IActivatedEventArgs^ /* args */
    )
{
    CoreWindow::GetForCurrentThread()->Activated +=
        ref new TypedEventHandler<CoreWindow^, WindowActivatedEventArgs^>(this, &MyViewProvider::OnWindowActivationChanged);
    CoreWindow::GetForCurrentThread()->Activate();
}


Manipular as mudanças efetuadas no estado da janela do aplicativo principal

Agora, implemente um método para manipular quaisquer mudanças efetuadas no estado da janela do aplicativo principal (CoreWindow). No exemplo a seguir, manipule:

O conjunto completo de estados do CoreWindow são enumerados em CoreWindowActivationState.



void MyViewProvider::OnWindowActivationChanged(
    _In_ Windows::UI::Core::CoreWindow^ /* sender */,
    _In_ Windows::UI::Core::WindowActivatedEventArgs^ args
    )
{
    if (args->WindowActivationState == CoreWindowActivationState::Deactivated)
    {
        // CoreWindow does not have focus
    }
    else if (args->WindowActivationState == CoreWindowActivationState::CodeActivated
        || args->WindowActivationState == CoreWindowActivationState::PointerActivated)
    {
        // CoreWindow has focus
    }
}


Iniciar a mensagem do evento de processamento para a janela do aplicativo principal

Suas chamadas de retorno ocorrem como mensagens de evento processadas pelo CoreDispatcher para o CoreWindowdo aplicativo. Essa chamada de retorno não será solicitada se você não chamar o CoreDispatcher::ProcessEvents a partir do loop principal do aplicativo (implementado no método IFrameworkView::Run de seu provedor de visualização).


// m_visible and m_windowsClose are class-level bool variables on MyViewProvider.

// ...

void MyViewProvider::Run()
{
    // your app's main loop!
    while (!m_windowClosed) // the app window is NOT closed
    {
        if (m_visible) // and if the app window is visible
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
                                                           CoreProcessEventsOption::ProcessAllIfPresent
                                                           );
        }
        else 
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(
                                                           CoreProcessEventsOption::ProcessOneAndAllPending
                                                           );
        }
    }
}

Tópicos relacionados

Como suspender um aplicativo (DirectX e C++)
Como retomar um aplicativo (DirectX e C++)
Diretrizes para suspensão e retomada de aplicativos
Ciclo de vida do aplicativo (aplicativos da Loja)

 

 

Mostrar:
© 2014 Microsoft