Suspending()、Resuming()、Closed() 和 Uninitialize() 未在 IFrameworkView 中调用

Suspending(), Resuming(), Closed() and Uninitialize() are not being called in IFrameworkView

我编写了一个简单的 DirectX11.2 应用程序,它可以运行。我想为应用程序退出时添加一些清理代码,但我注意到我的 window 实际上并没有正确处理关闭、暂停、恢复或取消初始化。

根据 IFrameworkView 文档,Uninitialize() 应该在应用程序退出之前被调用,但它永远不会被调用 (https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.core.iframeworkview?view=winrt-19041)

我订阅了应该在 window 挂起、恢复或关闭时触发的事件,但似乎 none 这些事件确实触发了。

我的印象是最小化 window 应该 暂停 应用程序,最小化后单击任务栏中的 window应该 恢复 应用程序,然后按 window 右上角的红色 X 按钮应该 关闭 应用程序,我是吗错了?

相关代码如下:


// the class definition for the core "framework" of our app
ref class App sealed: public IFrameworkView
{
    bool m_windowClosed;
    CGame m_game;

public:
    // this function subscribes to suspend and resume events, and gets called properly
    virtual void Initialize(CoreApplicationView^ appView) {
        // set the OnActivated function to handle to Acivated "event"
        appView->Activated += ref new TypedEventHandler<CoreApplicationView^, IActivatedEventArgs^>(this, &App::OnActivated);
        CoreApplication::Suspending += ref new EventHandler<SuspendingEventArgs^>(this, &App::Suspending);
        CoreApplication::Resuming += ref new EventHandler<Object^>(this, &App::Resuming);

        m_windowClosed = false;
    }

    // this function subscribes to the close() event. This function is called properly, but the Closed event never fires
    virtual void SetWindow(CoreWindow^ window){
        window->Closed += ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &App::Closed);
    }
    virtual void Load(String^ entryPoint) {}

    virtual void Run() {
        m_game.Initialize();
        
        CoreWindow^ Window = CoreWindow::GetForCurrentThread();

        // repeat until window closes
        while (!m_windowClosed) {
            // run processEvents() to dispatch events
            // ProcessAllIfPresent makes ProcessEvents return once all events have been processed
            Window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);

            // run the rest of the game code here
            m_game.Update();
            m_game.Render();
        }

        // we never get here!
        m_game.Finalize();
    }

    // never called, even though it should ALWAYS be called when the application exits?
    virtual void Uninitialize() {
        Log("Uninitialize()");
    }

    void OnActivated(CoreApplicationView^ coreAppView, IActivatedEventArgs^ args) {
        CoreWindow^ window = CoreWindow::GetForCurrentThread();
        window->Activate();
    }

    // never called
    void Suspending(Object^ sender, SuspendingEventArgs^ args) {
        Log("Suspending()");
    }

    // never called
    void Resuming(Object^ sender, Object^ args) {
        Log("Resuming()");
    }

    // never called
    void Closed(CoreWindow^ sender, CoreWindowEventArgs^ args) { 
        m_windowClosed = true; 
        Log("Close()");
    }
};

// the class definition that creates an instance of our core framework class
ref class AppSource sealed : IFrameworkViewSource {
public:
    virtual IFrameworkView^ CreateView() {
        // create an App class and return it
        return ref new App();
    }
};

[MTAThread]  // define main() as a multi-threaded-apartment function

// the starting point of all programs
int main(Array<String^>^ args) {
    // create and run a new AppSource class
    CoreApplication::Run(ref new AppSource());
    return 0;
}

经过进一步研究,我注意到 Suspend 和 Resume 通常在 Windows 自身挂起(睡眠、休眠)和恢复(从睡眠或休眠中“唤醒”)时被调用。

我现在发现在我的应用程序终止之前调用的唯一事件是 CoreWindow::VisibilityChanged 事件。