0

Dans une application Windows Universal App (WinRT), j'essaie de capturer une image bitmap de la page en cours (ou une partie de celle-ci).Comment utiliser RenderTargetBitmap?

Une recherche google a indiqué que je devrais utiliser la classe Windows :: UI :: Xaml :: Média :: Imaging :: RenderTargetBitmap (plus spécifiquement sa méthode RenderAsync()) pour capturer l'écran.

Dans une petite application de l'échantillon, j'ai donc ajouté ce code (C++):

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

(pclElem est un FrameworkElement, plus précisément une toile, et non nul)

Lorsque j'exécute cette code, la tâche est en effet créée, mais le lambda dans le "then" n'est jamais appelé. C'est comme si RenderAsync() ne se terminait jamais.

Est-ce que quelqu'un a une quelconque expérience de l'utilisation de cette fonction en C++? Qu'est-ce que je rate ?

Merci pour vos réponses.

+0

Je me demande si votre problème est que la classe elle-même pclRenderTargetBitmap va hors de portée. Si c'est dans une fonction appelée, elle retournera sans bloquer sur l'opération asynchrone. Alors pclRenderTargetBitmap sortirait de la portée. Pour vérifier, vous pourriez essayer de faire de pclRenderTargetBitmap un membre de 'this' qui ferait passer sa durée de vie au-delà de la fonction en question. –

+0

C'était en effet le problème! Merci beaucoup pour votre réponse. Et pour votre information, ceci peut également être résolu juste en passant les paramètres de lambda par valeur au lieu de par référence: auto pclRenderTargetBitmap = ref nouveau Windows :: UI :: Xaml :: Media :: Imaging :: RenderTargetBitmap; Concurrency :: create_task (pclRenderTargetBitmap-> RenderAsync (pclElem, 100,100)). Then ([=]() { // gestion du code ici }); –

Répondre

0

Merci à Andy Rich pour sa réponse. Le problème était que pclRenderTargetBitmap était hors de portée. Ceci peut être résolu en passant les paramètres lambda par valeur:

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