Windows 應用程式 SDK 桌面應用程式的應用程式生命週期

本文描述 Windows 應用程式 SDK 桌面應用程式從啟動到終止的生命週期。 了解生命週期有助於管理狀態、節省資源,並提供流暢的使用者體驗。

Important

與 UWP 應用程式不同,桌面應用程式(包括 WinUI 3) 不受 UWP 流程生命週期管理(PLM)模式的自動暫停與終止機制約束。 這些程式會持續運行,直到使用者關閉或程序退出為止。 然而,打包桌面應用程式仍需遵守系統範圍的電力與資源政策——例如,現代待機可在裝置休眠時暫停所有使用者模式程序(包括您的應用程式),而 Windows 則可能套用效率模式(EcoQoS)來限制背景或最小化應用程式的 CPU 優先權與服務品質。 你的應用程式仍應能優雅地處理意外關機(例如停電、作業系統更新,或使用者透過工作管理員結束流程),且不應假設它在背景時總是擁有全速 CPU 存取權限。

生命週期概述

Windows 應用程式 SDK 桌面應用程式的生命週期比 UWP 簡單:

State Description
未執行 應用程式程序尚未啟動。
執行中 應用程式是啟用的。 它可能有也可能沒有明顯的窗戶。
已關閉 使用者(或系統)終止了這個流程。

因為沒有暫停狀態,你不需要像 UWP 應用程式那樣處理 Suspending 事件 Resuming 。 相反地,請專注於:

  • 當視窗關閉或應用程式關閉時,會儲存使用者狀態。
  • 處理啟動(啟動、檔案、協定或其他啟動類型)。
  • 有效管理背景工作,節省攜帶裝置的電池。

應用程式啟動

當使用者啟動你的應用程式時,Microsoft。UI。Xaml.Application.OnLaunched 方法執行。 用它初始化你的主視窗並導向你的第一頁。

public partial class App : Microsoft.UI.Xaml.Application
{
    private Microsoft.UI.Xaml.Window? m_window;

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        m_window = new MainWindow();
        m_window.Activate();
    }
}

// MainWindow is the window class generated by the WinUI 3 project
// template (MainWindow.xaml / MainWindow.xaml.cs).
public partial class MainWindow : Microsoft.UI.Xaml.Window
{
}

Note

Windows 應用程式 SDK 桌面應用程式不會從系統中獲得一個數值PreviousExecutionState。 如果你需要在當機或意外終止後還原狀態,請實作自己的狀態持久機制(例如,在計時器或重要動作完成時將狀態儲存到本地檔案)。

應用程式啟動

Windows 應用程式 SDK 透過 Microsoft.Windows.AppLifecycle 命名空間提供豐富的啟用支援。 您的應用程式可以透過以下方式啟用:

  • 預設啟動 — 使用者選擇你的應用程式圖示。
  • 檔案啟用 — 使用者開啟與你的應用程式相關的檔案類型。
  • 協定啟動 — 啟動註冊在你應用程式上的 URI 方案。
  • 啟動啟用 — 您的應用程式會註冊為在使用者登入時啟動。
  • 其他 — 快顯通知、分享目標及其他啟動類型。

使用 AppInstance.GetActivatedEventArgs 來判斷啟用類型:

using Microsoft.Windows.AppLifecycle;

var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();

switch (activatedArgs.Kind)
{
    case ExtendedActivationKind.File:
        var fileArgs = activatedArgs.Data as
            Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
        // Handle the file
        break;

    case ExtendedActivationKind.Protocol:
        var protocolArgs = activatedArgs.Data as
            Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs;
        // Handle the URI
        break;

    case ExtendedActivationKind.Launch:
    default:
        // Standard launch
        break;
}

封裝應用程式會透過 Package.appxmanifest註冊檔案與協定啟用。 未封裝的應用程式沒有清單,所以它們會在程式碼 Microsoft.Windows.AppLifecycle.ActivationRegistrationManager中註冊相同的啟用類型。 如需詳細了解兩種方法,請參閱 Windows 應用程式 SDK 的應用程式啟用

在背景與前景中執行

桌面應用程式無論是否在前景,都會繼續運行。 系統不會在使用者切換到其他應用程式時停止你的執行緒或回收記憶體。 不過,你仍然可以回應可視性變更以優化資源使用:

  • 當視窗最小化時,釋放高耗用的 GPU 或算繪資源。
  • 當視窗失去焦點時,暫停動畫或媒體預覽。
  • 降低背景輪詢的計時器頻率。

Microsoft.UI.Xaml.Window 不會公開 VisibilityChanged 事件。 相反地,請利用事件 Window.Activated 偵測視窗何時獲得或失去焦點,或用 AppWindow.Changed 來偵測呈現者狀態的變化(例如最小化或恢復):

// m_window is the field declared on your App type (see "App launch" above).
Microsoft.UI.Xaml.Window m_window = this;

m_window.Activated += (sender, args) =>
{
    if (args.WindowActivationState == WindowActivationState.Deactivated)
    {
        // Window lost focus — consider reducing work,
        // for example pausing animations or media preview
    }
    else
    {
        // Window is active — resume normal work
    }
};

// To specifically detect minimize/restore, use AppWindow.Changed
var appWindow = m_window.AppWindow;
appWindow.Changed += (sender, args) =>
{
    if (args.DidPresenterChange)
    {
        if (sender.Presenter is OverlappedPresenter presenter &&
            presenter.State == OverlappedPresenterState.Minimized)
        {
            // Window is minimized — pause expensive rendering
        }
        else
        {
            // Window is restored — resume rendering
        }
    }
};

Tip

在電池供電的裝置上,當應用程式不被看見時減少背景工作,能提升電池續航力和系統反應速度,即使系統本身不會強制暫停。

儲存狀態

因為桌面應用程式不會被暫停,你可以控制何時儲存狀態。 建議的方法:

  • 視窗關閉時 — 處理 Window.Closed 事件以持久化資料。
  • 定期儲存 — 使用計時器間隔儲存狀態(例如每60秒一次)。
  • 關於重要動作 ——使用者完成重要動作(例如完成編輯)後儲存。
// m_window is the field declared on your App type (see "App launch" above).
Microsoft.UI.Xaml.Window m_window = this;

m_window.Closed += (sender, args) =>
{
    SaveApplicationState();
};

// Replace with your own logic to persist app state.
void SaveApplicationState() { }

應用程式關閉與終止

桌面應用程式在以下情況下終止:

  • 使用者關閉最後一個視窗。
  • 你的程式碼呼叫 Application.Current.Exit()
  • 該程序會在外部結束(工作管理員、系統關機)。

不存在像 UWP 那樣的「系統終止以釋放資源」狀態。 您的應用程式會持續執行,直到明確結束為止。

Note

如果你的應用程式當機,它會從頭重啟。 實施定期狀態儲存以減少資料遺失。

與 UWP 應用程式生命週期的差異

行為 UWP Windows 應用程式 SDK(桌面版)
自動懸吊(PLM) 是的——在背景執行幾秒後 不行——但整個裝置仍可進入現代待機狀態
終止系統程序以釋放記憶體 是的——被暫停的應用程式可能會被終止 No
Suspending / Resuming 活動 Yes 不適用
預備推出 是(選擇加入) No
背景狀態已強制執行 Yes 沒有——但效率模式(EcoQoS)可能會限制背景應用程式
終止後的狀態恢復 良好使用者體驗的必備條件 可選——自行實作