在C++/WinRT项目中,Microsoft::UI命名空间的头文件在哪里?
我想编译并测试下面的代码,我在MSDN上找到了一个示例,链接如下:MSDN上的示例:
bool SetupBackdrop(winrt::Microsoft::UI::WindowId windowId, winrt::Windows::UI::Composition::CompositionTarget compositionTarget)
{
winrt::Microsoft::UI::Composition::SystemBackdrops::DesktopAcrylicController desktopAcrylicController = winrt::DesktopAcrylicController();
return desktopAcrylicController.SetTarget(windowId, compositionTarget);
}
我在VS 2022中创建了一个新的C++/WinRT项目。它在 pch.h 中包含了大量与WinRT相关的头文件:
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Hosting.h>
#include <winrt/Windows.UI.Xaml.Media.h>
#include <Windows.UI.Xaml.Hosting.DesktopWindowXamlSource.h>
该项目已成功构建。到目前为止,一切都好。但是,当我尝试查找与 winrt::Microsoft::UI::WindowId 对应的头文件时,我就找不到。
我猜,下面的说明并没有覆盖我的情况:https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/consume-apis#cwinrt-projection-headers。我的意思是,当我尝试 #include <winrt/Microsoft.UI.h> 时,文件找不到。
我要如何解决?我应该从NuGet安装些什么?
我看到有 midl.exe 的提及。如今它是不是像在COM时代那样通过IDL生成头文件?如果是这样,我应该编译哪个.idl文件?另外,是否存在与 #import 指令等价的做法,这是在COM中更好的途径?
此外,我还尝试了 这个回答:
#include <wil/cppwinrt.h>
#include <wil/cppwinrt_helpers.h>
(对 wil 一无所知),但都无济于事。
更新
最简单的修复方法是在Visual Studio中创建一个新的 WinUI C++项目(而不是C++/WinRT)。
但我不确定,区别在哪里。它是某种NuGet包吗?还是 packages.config?
更新2
不幸的是,WinUI项目需要打包,不能仅仅运行,直到我让它实现自包含部署(self-contained)。你可以在这里查看自包含部署的文档。对于我现有的Win32窗口来说,这有点儿超纲了,因为我只需要对 winrt::Microsoft::UI::Composition::SystemBackdrops::DesktopAcrylicController::SetTarget() 做一次调用。
解决方案
你从哪里得到 winrt::Microsoft::UI::WindowId,这个命名空间?至于手册中的 WindowId Struct,标识符位于命名空间 winrt::Windows::UI。
winrt::Microsoft::UI::WindowId 定义在 winrt/impl/Windows.UI.0.h,但你不应该包含这个文件;如果愿意,可以包含 winrt/windows.ui.h,尽管不是必须,因为该文件通过已经包含在显示代码中的 winrt/Windows.UI.Xaml.h 间接包含。