アプリをアクティブ化する方法 (DirectX と C++)

Applies to Windows and Windows Phone

ここでは、DirectX と C++ を使った Windows ランタイム アプリのアクティブ化エクスペリエンスを定義する方法を説明します。

アプリのアクティブ化イベント ハンドラーを登録する

まず、CoreApplicationView::Activated イベントを処理するための登録を行います。このイベントは、アプリが開始され、オペレーティング システムによって初期化されるときに発生します。

  • Applies to Windows Phone

  Windows Phone では、このメソッドは、ユーザーがスタート タイルやアプリの一覧からアプリを起動するたびに呼び出されます (アプリが現在一時停止されている場合も含む)。アプリでは、アクティブ化パラメーターを確認して、前のエクスペリエンスを再開するか、新しいパラメーターを使って起動されるときに新しい画面を表示するかどうかを決定する必要があります。

次のコードをビュー プロバイダー (この例では MyViewProvider という名前) の IFrameworkView::Initialize メソッドの実装に追加します。



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

   // ...

}


アプリの CoreWindow インスタンスをアクティブ化する

アプリの起動時に、アプリの CoreWindow への参照を取得する必要があります。CoreWindow には、アプリがウィンドウ イベントの処理に使うウィンドウ イベント メッセージ ディスパッチャーが含まれています。アプリのアクティブ化イベントのコールバックで、CoreWindow::GetForCurrentThread を呼び出して、この参照を取得します。この参照を取得した後で、次の操作を行います。

  • メイン アプリ ウィンドウのアクティブ化イベント CoreWindow::Activated のイベント ハンドラーを作成し、アタッチします。このイベントは、メイン アプリ ウィンドウがフォーカスを取得するか失うときに発生します。
  • 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();
}


メイン アプリ ウィンドウの状態に対する変更の処理

ここで、メイン アプリ ウィンドウ (CoreWindow) の状態に対する変更を処理するためのメソッドを実装します。以下のサンプルでは、次の処理を行います。

CoreWindow の状態の完全なセットは、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
    }
}


メイン アプリ ウィンドウのイベント メッセージの処理の開始

作成したコールバックは、アプリの CoreWindowCoreDispatcher によって処理されるイベント メッセージとして発生します。このコールバックは、アプリのメイン ループ (ビュー プロバイダーの IFrameworkView::Run メソッドで実装) から CoreDispatcher::ProcessEvents を呼び出さない場合は呼び出されません。


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

関連トピック

アプリを一時停止する方法 (DirectX と C++)
アプリを再開する方法 (DirectX と C++)
アプリの一時停止と再開のガイドライン
アプリケーションのライフサイクル (Windows ランタイム アプリ)

 

 

表示:
© 2014 Microsoft