首页 > 解决方案 > 通过 C++/WinRT 使用相机

问题描述

我想在 C++/WinRT 中使用相机(CameraCaptureUI 或 MediaCapture 类)。

Microsoft 文档示例代码由 C# 和 JavaScript 编写。

https://docs.microsoft.com/en-us/uwp/api/Windows.Media.Capture.CameraCaptureUI#code-snippet-1


MFC + C++/WinRT

void CWinRTtestDlg::OnBnClickedButtonToast()
{
    // show toast
    auto notificationManager = ToastNotificationManager::GetDefault();
    auto toastXml = ToastNotificationManager::GetTemplateContent(ToastTemplateType::ToastText01);
    auto textNode = toastXml.GetElementsByTagName(L"text").Item(0);
    textNode.AppendChild(toastXml.CreateTextNode(L"Hello C++/WinRT!"));
    auto toast = ToastNotification(toastXml);
    toast.ExpirationTime(winrt::clock::now() + std::chrono::hours() * 2);
    notificationManager.CreateToastNotifier().Show(toast);
}

此代码正在运行。

IAsyncAction Camera()
{
    auto cameraManager = CameraCaptureUI();
    cameraManager.PhotoSettings().CroppedAspectRatio(Size(4, 3));
    cameraManager.PhotoSettings().Format(CameraCaptureUIPhotoFormat::Jpeg);
    auto file{ co_await cameraManager.CaptureFileAsync(CameraCaptureUIMode::Photo) };
}

void CWinRTtestDlg::OnBnClickedButtonCamera()
{
    winrt::init_apartment();
    auto image = Camera();
}

但这段代码不起作用......


C++ 项目设置
Additional Option /await
C++ Language Standard C++17
Conformance mode

标签: camerac++-winrt

解决方案


团队正在慢慢添加 C++ 示例,但这需要时间。在大多数情况下,音译应该不会太难。如果它是 C# 构造函数,请将其替换为 C++ 构造函数。例如:

Widget widget = new Widget(123);

变成:

Widget widget(123);

C++ 中不存在属性,因此您只需添加括号并将其视为方法即可。您还可以使用协程,因此awaitC# 中的 a 变成co_awaitC++ 中的 a。


推荐阅读