You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置Acrylic背景时WinUI 3应用崩溃问题求助

WinUI 3 C++ 设置Acrylic背景时AddSystemBackdropTarget抛出hresult_error的解决方案

问题根源分析

你的代码存在几个关键问题,导致调用AddSystemBackdropTarget时抛出异常:

  1. DesktopAcrylicController生命周期过短:局部变量会在函数执行完毕后立即销毁,控制器绑定的目标会因对象释放触发异常。
  2. SystemBackdropConfiguration未正确初始化:未设置主题、输入激活状态等必要属性,控制器无法完成配置绑定。
  3. 缺少系统兼容性检查:Acrylic效果仅支持Windows 11 22000及以上版本,低版本系统调用会直接报错。

修复后的代码示例

首先在MainWindow类中添加成员变量,保留控制器和配置的生命周期:

private:
    winrt::Microsoft::UI::Composition::SystemBackdrops::DesktopAcrylicController m_acrylicController{ nullptr };
    winrt::Microsoft::UI::Composition::SystemBackdrops::SystemBackdropConfiguration m_backdropConfig{ nullptr };

修改按钮点击事件的实现:

void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    // 检查系统是否支持DesktopAcrylic效果
    if (!Microsoft::UI::Composition::SystemBackdrops::DesktopAcrylicController::IsSupported())
    {
        MessageBox(NULL, L"当前系统不支持Acrylic背景效果", L"错误", MB_OK | MB_ICONERROR);
        return;
    }

    // 获取窗口的SystemBackdrop目标对象
    auto target = this->try_as<Microsoft::UI::Composition::ICompositionSupportsSystemBackdrop>();
    if (!target)
    {
        MessageBox(NULL, L"当前窗口不支持系统背景效果", L"错误", MB_OK | MB_ICONERROR);
        return;
    }

    // 初始化系统背景配置
    if (!m_backdropConfig)
    {
        m_backdropConfig = Microsoft::UI::Composition::SystemBackdrops::SystemBackdropConfiguration();
        
        // 绑定窗口主题变化事件,自动更新配置的主题属性
        this->ActualTheme([this](auto&&, auto&&)
        {
            m_backdropConfig.Theme(winrt::Microsoft::UI::Composition::SystemBackdrops::SystemBackdropTheme(this->ActualTheme()));
        });
        m_backdropConfig.Theme(winrt::Microsoft::UI::Composition::SystemBackdrops::SystemBackdropTheme(this->ActualTheme()));
        
        // 设置窗口输入激活状态
        m_backdropConfig.IsInputActive(true);
    }

    // 初始化Acrylic控制器
    if (!m_acrylicController)
    {
        m_acrylicController = Microsoft::UI::Composition::SystemBackdrops::DesktopAcrylicController();
    }

    try
    {
        m_acrylicController.AddSystemBackdropTarget(target);
        m_acrylicController.SetSystemBackdropConfiguration(m_backdropConfig);
    }
    catch (winrt::hresult_error const& ex)
    {
        // 捕获异常并输出具体错误信息
        std::wstring errorMsg = L"设置Acrylic背景失败: " + ex.message();
        MessageBox(NULL, errorMsg.c_str(), L"错误", MB_OK | MB_ICONERROR);
    }
}

额外注意事项

  • 确保项目目标版本设置为**Windows 11 22000(10.0.22000.0)**或更高,可在项目属性的「常规」标签页中修改。
  • 若为打包应用,需在Package.appxmanifest中添加internetClient能力(部分系统背景效果依赖该权限)。
  • 捕获异常时可通过ex.code()获取具体HRESULT值,比如E_NOTSUPPORTED表示系统版本不兼容,E_INVALIDARG表示参数配置错误,便于精准排查。

内容的提问来源于stack exchange,提问作者Davide_24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:57:22