如何激活应用(DirectX 和 C++)

本主题介绍了如何为组合使用 DirectX 和 C++ 的 Windows 运行时应用定义激活体验。

注册应用激活事件处理程序

首先,注册以处理 CoreApplicationView::Activated 事件,当启动你的应用并由操作系统对你的应用进行初始化时会引发该事件。

注意  在 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
    }
}


为主屏窗口启动处理事件消息

对于应用的 CoreWindow,你的回调是由 CoreDispatcher 处理的事件消息。如果你没有从你的应用的主回路调用 CoreDispatcher::ProcessEvents(在你的查看提供程序的 IFrameworkView::Run 方法中实现),那么将不会调用此回调。


// 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++)
应用的挂起和恢复指南
应用程序生命周期(应用商店应用)

 

 

显示:
© 2015 Microsoft