Joh*_*don 6 c++ visual-c++ windows-runtime visual-studio-2017
我正在尝试使用C++/WinRT编写一些有趣的东西。我的 Windows 编程经验很少,也没有 C++/CX 经验,因此我首先尝试示例程序 (OCR)。
示例程序是关于光学字符识别的,我将其修改为面部检测器(基于控制台)。效果非常好。
我想将获取文件从命令行转换为文件对话框,因此我从 C#移植了以下代码片段:
FileOpenPicker picker = FileOpenPicker();
picker.ViewMode(PickerViewMode::Thumbnail);
picker.SuggestedStartLocation(PickerLocationId::PicturesLibrary);
picker.FileTypeFilter().Append(L".jpg");
picker.FileTypeFilter().Append(L".jpeg");
picker.FileTypeFilter().Append(L".png");
StorageFile file = co_await picker.PickSingleFileAsync();
Run Code Online (Sandbox Code Playgroud)
没有编译错误,但是当我运行程序时,我收到以下错误消息:
hresult_error: (0x80070578) Invalid window handle.
Run Code Online (Sandbox Code Playgroud)
我认为发生该错误是因为它是基于控制台的程序(wmain),而不是wWinMain。
我尝试在网上寻找解决方案,但都是关于UWP的。请提供一个不涉及UWP并且必须能够cl.exe
直接编译的解决方案。
笔记:
根据可从经典桌面应用程序调用的 UWP API,如果 API 具有DualApiPartitionAttribute属性,则它将在经典桌面应用程序中工作,否则不会。例如,Geolocator具有此属性,因此它可以工作。
然而,即使FaceDetector没有这个属性,它仍然可以在我的玩具程序中得到证明。
任何东西都Windows::UI
肯定需要 UWP(尽管有https://aka.ms/windowsui/inwin32)。FileOpenPicker 没有此属性,但它不在 下Windows::UI
,因此可能有解决方法。
完整代码:
#pragma comment(lib, "windowsapp")
#include <winrt/Windows.Storage.Pickers.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Media.FaceAnalysis.h>
using namespace winrt;
using namespace std::chrono;
using namespace Windows::Foundation;
using namespace Windows::Storage;
using namespace Windows::Storage::Pickers;
using namespace Windows::Storage::Streams;
using namespace Windows::Graphics::Imaging;
using namespace Windows::Media::FaceAnalysis;
using Windows::Foundation::Collections::IVector;
IAsyncOperation<int> AsyncSample() {
FileOpenPicker picker = FileOpenPicker();
picker.ViewMode(PickerViewMode::Thumbnail);
picker.SuggestedStartLocation(PickerLocationId::PicturesLibrary);
picker.FileTypeFilter().Append(L".jpg");
picker.FileTypeFilter().Append(L".jpeg");
picker.FileTypeFilter().Append(L".png");
StorageFile file = co_await picker.PickSingleFileAsync();
//StorageFile file = co_await StorageFile::GetFileFromPathAsync(
// L"C:\\Users\\user\\Pictures\\20170318_202325.jpg");
IRandomAccessStream stream = co_await file.OpenAsync(FileAccessMode::Read);
BitmapDecoder decoder = co_await BitmapDecoder::CreateAsync(stream);
SoftwareBitmap bitmap = co_await decoder.GetSoftwareBitmapAsync();
FaceDetector detector = co_await FaceDetector::CreateAsync();
SoftwareBitmap converted =
SoftwareBitmap::Convert(bitmap, BitmapPixelFormat::Nv12);
IVector<DetectedFace> result = co_await detector.DetectFacesAsync(converted);
printf("Detection done\n");
for (auto& face : result) {
BitmapBounds box = face.FaceBox();
printf("[%u %u %u %u]\n", box.X, box.Y, box.Width, box.Height);
}
printf("Printing done\n");
return 0;
}
int wmain() {
init_apartment();
try {
int res = AsyncSample().get();
printf("%d\n", res);
} catch (hresult_error& e) {
printf("hresult_error: (0x%8X) %ls\n", e.code(), e.message().c_str());
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是需要的修改:
IAsyncOperation<int> AsyncSample() {
HWND hwnd = GetConsoleWindow(); // #include <windows.h>
FileOpenPicker picker = FileOpenPicker();
picker.as<IInitializeWithWindow>()->Initialize(hwnd);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1772 次 |
最近记录: |