アプリを再開する方法 (DirectX と C++)

このトピックでは、DirectX と C++ を使った Windows ランタイム アプリをシステムが再開するときに重要なアプリケーション データを復元する方法を説明します。

resuming イベント ハンドラーに登録する

CoreApplication::Resuming イベントを処理するために登録します。このイベントは、ユーザーがアプリを切り替えてから、アプリに戻ったことを示します。

次のコードをビュー プロバイダー (この例では DirectXApp という名前) の 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
    )
{

   // ...

   CoreApplication::Resuming +=
       ref new EventHandler<Platform::Object^>(this, &MyViewProvider::OnResuming);

   // ...
}

一時停止の後で表示されるコンテンツを更新する

アプリでは、Resuming イベントを処理する時点で、表示されているコンテンツを更新できます。CoreApplication::Suspending のハンドラーで保存した任意のアプリを復元し、処理を再開します。ゲーム開発の場合、オーディオ エンジンを一時停止していたら、ここで再開します。


void MyViewProvider::OnResuming(
    _In_ Platform::Object^ /* sender */,
    _In_ Platform::Object^ /* args */
    )
{
    // restore app state, restart rendering/processing and refresh the display
}

このコールバックは、アプリの 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 ランタイム アプリ)

 

 

表示:
© 2015 Microsoft