一种不使用XAML关闭DirectX Metro应用程序的方法

A way to close DirectX Metro application without XAML

本文关键字:DirectX 关闭 Metro 应用程序 方法 XAML 一种      更新时间:2023-10-16

我正在启动我的DirectX 11.1 Metro(没有XAML)应用程序,如下所示:

[Platform::MTAThread]
int main(Platform::Array<Platform::String^>^)
{
    // Some additional initializations
    //...
    auto frameworkViewSource = ref new MyFrameworkViewSource();
    Windows::ApplicationModel::Core::CoreApplication::Run(frameworkViewSource);
}

运行函数如下:

virtual void Run()
    {
        while(!m_windowClosed)
        {
            CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
            DoWork();
    }

}

然后我试图调用退出函数(在用户请求退出的情况下):

Quit()
{
    // Uninit variables
    //...
    Windows::ApplicationModel::Core::CoreApplication::Exit();
}

,

Windows::ApplicationModel::Core::CoreApplication::Exit();

无效。结果,我在DoWork()函数中崩溃了,因为变量未初始化,但应用程序未退出,while循环仍在继续。

此外,如果我从退出函数调用CoreWindow::GetForCurrentThread()->Close(),调试器永远不会命中OnWindowClosed事件处理程序:

m_window->Closed += ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &MyFrameworkView::OnWindowClosed);
void MyFrameworkView::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args)
{
    m_windowClosed = true;
}

问题是:如果我计划在菜单中有"退出"项目,我如何正确退出游戏?

简短的回答:你不能。

长篇大论:Windows Store应用程序模型不允许应用程序以编程方式关闭,无论它们是使用DirectX, XAML还是JavaScript。相反,用户必须使用一种标准手势或动作(从顶部向下滑动或ALT+F4)关闭。应用程序只能在崩溃时以编程方式退出。