0

В приложении Windows Universal App (WinRT) я пытаюсь захватить растровое изображение текущей страницы (или ее части).Как использовать RenderTargetBitmap?

В результате поиска в Google указано, что для захвата экрана я должен использовать класс Windows :: UI :: Xaml :: Media :: Imaging :: RenderTargetBitmap (точнее его метод RenderAsync()).

В небольшом образце приложения, я, таким образом, добавили этот код (C++):

auto pclRenderTargetBitmap = ref new Windows::UI::Xaml::Media::Imaging::RenderTargetBitmap; 
Concurrency::create_task(pclRenderTargetBitmap->RenderAsync(pclElem,100,100)).then([&]() { 
    // handling code here 
}); 

(pclElem является FrameworkElement, более конкретно, холст, и не равно нулю)

Когда я выполнить это код, задача действительно создана, но лямбда в «тогда» никогда не называется. Это как если RenderAsync() никогда не заканчивается.

Есть ли у кого-нибудь опыт использования этой функции в C++? Что мне не хватает?

Спасибо за ваши ответы.

+0

Интересно, если ваша проблема в том, что сам pclRenderTargetBitmap класс выходит из области видимости. Если это функция, которая вызывается, она будет возвращаться без блокировки операции async. Тогда pclRenderTargetBitmap выйдет за рамки. Чтобы проверить, вы могли бы попытаться сделать pclRenderTargetBitmap членом этого «этого», чтобы продлить срок его службы до этой функции. –

+0

Это действительно проблема! Большое спасибо за ваш ответ. И для вашей информации это также можно решить juste, передав параметры лямбда по значению, а не по ссылке: auto pclRenderTargetBitmap = ref new Windows :: UI :: Xaml :: Media :: Imaging :: RenderTargetBitmap; Параллельность :: create_task (pclRenderTargetBitmap-> RenderAsync (pclElem, 100,100)), затем ([=]() { // код обработки здесь }); –

ответ

0

Спасибо Andy Rich за его ответ. Проблема заключалась в том, что pclRenderTargetBitmap выходит за рамки. Это может быть решен путем передачи параметров по значению лямбды:

auto pclRenderTargetBitmap = ref new Windows::UI::Xaml::Media::Imaging::RenderTargetBitmap; 
Concurrency::create_task(pclRenderTargetBitmap->RenderAsync(pclElem,100,100)).then([=]() { 
     // handling code here 
}); 
Смежные вопросы