BitBlt Fenêtre Cachée.. Une solution ?

Résolu
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009 - 19 mai 2009 à 15:37
wkenw Messages postés 19 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 août 2009 - 3 août 2009 à 21:49
Bonjour à tous, voilà je me trouve confronté à un petit problème. En fait je voudrais afficher une copier le contenu graphique d'une fenêtre.

La fonction marche très bien mais seulement quand la fenêtre cible est activée, donc ça ne marche pas quand c'est caché :(

Y'aurait-il un moyen de contourner ce problème ?
J'ai regardé sur divers forums mais apparement personne n'a su solutionner le problème.

Voici la portion de code que j'utilise:

HDC targetDC = GetDCEx(target_HWND,0,DCX_CACHE);
if (targetDC) {
BitBlt(hDC,0,400,200,200,target_DC,0,0,SRCCOPY);
ReleaseDC(target_HWND,target_DC);
}

hDC est le context où j'affiche l'aperçu de la fenêtre (geré lors du WM_PAINT).

De plus il me semble que la fonction PrintWindow() a le même problème.

En vous remerciant.

12 réponses

Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
28 mai 2009 à 01:54
Ok j'avais approximativement fait un program du genre, mais j'obtiens le même résultat qu'avec le tiens, à savoir une fenêtre noir. En tout cas merci pour les conseils, et l'upload du prog.

Conclusion, on ne peut pas obtenir le contenu d'une fenêtre cachée.

Bonne journée
3
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
19 mai 2009 à 16:08
Arf, le texte s'est mal mis en forme. Un modérateur pourrais-t-il corriger ça ?
0
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
20 mai 2009 à 17:54
Ok personne ne sait, c'est bien ce qu'il me semblais :)

Passez une bonne journée.
0
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
23 mai 2009 à 16:26
Merci pour les liens, en fait j'ai essayé celui de racpp.. le problème étant que si la fenêtre n'est pas active, PrintWindow renvoi une fenêtre noir.

À vrai dire je ne pense pas qu'il y ait de solutions pour obtenir des fenêtres invisibles :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 mai 2009 à 17:44
Hein ? Qu'appelles tu inactives ? Je viens de refaire des essais avec le Delphi, avec une fenêtre de calculatrice qui :
<li>N'a pas le focus.</li><li>A une partie d'elle même en dehors de l'écran.</li><li>A une partie d'elle même derrière une fenêtre.</li>
Et pourtant... Pourtant PrintWindow a parfaitement travaillé !

Bon, ça ne marche pas sur toutes les application (A base de DirectDraw...), si la fenêtre est minimisée, cela fait une impression écran du bouton dans la barre des tâches...
MAIS, si tu n'es pas arrivé au même résultat avec la calculatrice, c'est que tu as raté quelque chose...
0
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
23 mai 2009 à 18:28
Ok c'est vrai que ça à l'air de marcher, mais tu n'a pas ton executable dispo quelque part (pour que je test de mon côté), en fait j'ai pas de compilateur Deplhi, juste basic et C++, mais j'pense que si ça marche j'essairai de convertir au mieux ton bout de code ;)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 mai 2009 à 20:38
Le voici sur dl.free.fr.
0
wkenw Messages postés 19 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 août 2009
9 juil. 2009 à 18:54
En fait je viens de tomber sur le même problème. Contrairement à ce que tu dis, on peut obtenir une capture d'écran d'une fenêtre cachée.
racpp (et oui, toujours lui !) explique comment faire ici. Je me demande comment il connaît tout ça !

Pour info, mon code est :
HWND hWnd = FindWindow(NULL, "Titre Fenetre");

HDC hWndDC = GetWindowDC(hWnd);

HDC hdcMemDC = CreateCompatibleDC(hWndDC);

RECT rcClient;

GetClientRect(hWnd, &rcClient);  // GetWindowRect pour avoir la decoration

SetStretchBltMode(hWndDC,HALFTONE);

HBITMAP hBitmap = CreateCompatibleBitmap(hWndDC, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);

SelectObject(hdcMemDC, hBitmap);

PrintWindow(hWnd,hdcMemDC,0);

CreateBMPFile(hWnd, "c:\\captureqwsx.bmp", hBitmap, hdcMemDC);

où CreateBMPFile est une fonction inspirée de codes d'exemples MSDN.
A bientôt
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
9 juil. 2009 à 18:59
wkenw -> Tu as pas lu le thread mon grand ! Je filais le même lien dans mon premier message. Et Hades53 s'est effectivement basé sur le code de racpp. Mais pourquoi dans son cas (Quel cas d'ailleurs ? Aaaah. Peut être une fenêtre cachée avec SW_HIDE ou autre !) ça n'a pas fonctionné, mystère...
0
wkenw Messages postés 19 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 août 2009
9 juil. 2009 à 21:07
arf ! la boulette ! au temps pour moi
0
Poteag Messages postés 1 Date d'inscription jeudi 29 janvier 2004 Statut Membre Dernière intervention 3 août 2009
3 août 2009 à 19:55
il n'est pas nécessaire de cacher la fenêtre, il suffit de la déplacer au delà de l'écran avec un move. Ça marche très bien.
0
wkenw Messages postés 19 Date d'inscription mardi 30 septembre 2008 Statut Membre Dernière intervention 3 août 2009
3 août 2009 à 21:49
t'es sûr ? Moi quand je fais ça je ne peux récupérer que la partie potentiellement visible de la fenêtre
0
Rejoignez-nous