BitBlt Fenêtre Cachée.. Une solution ? [Résolu]

Signaler
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009
-
Messages postés
19
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 août 2009
-
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

Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

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
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

Arf, le texte s'est mal mis en forme. Un modérateur pourrais-t-il corriger ça ?
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

Ok personne ne sait, c'est bien ce qu'il me semblais :)

Passez une bonne journée.
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

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 :(
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
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...
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

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 ;)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Le voici sur dl.free.fr.
Messages postés
19
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 août 2009

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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
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...
Messages postés
19
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 août 2009

arf ! la boulette ! au temps pour moi
Messages postés
1
Date d'inscription
jeudi 29 janvier 2004
Statut
Membre
Dernière intervention
3 août 2009

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.
Messages postés
19
Date d'inscription
mardi 30 septembre 2008
Statut
Membre
Dernière intervention
3 août 2009

t'es sûr ? Moi quand je fais ça je ne peux récupérer que la partie potentiellement visible de la fenêtre