设置Acrylic背景时WinUI 3应用崩溃问题求助
WinUI 3 C++ 设置Acrylic背景时AddSystemBackdropTarget抛出hresult_error的解决方案
问题根源分析
你的代码存在几个关键问题,导致调用AddSystemBackdropTarget时抛出异常:
DesktopAcrylicController生命周期过短:局部变量会在函数执行完毕后立即销毁,控制器绑定的目标会因对象释放触发异常。SystemBackdropConfiguration未正确初始化:未设置主题、输入激活状态等必要属性,控制器无法完成配置绑定。- 缺少系统兼容性检查: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
相关产品推荐
相关产品推荐

