Capturer le contenu d'une fenetre - Win32 - C++ - Programmation
Marsh Posté le 09-08-2005 à 10:18:20
C'est assez coton, mais y'a un bon article sur le sujet:
http://www.fengyuan.com/article/wmprint.html
Marsh Posté le 09-08-2005 à 17:05:35
oui, je connais cet article mais cela fonctionne uniquement lorsque que c l'appli elle meme qui lance le WM_PRINT
javai essaye ceci mais sans succes
Code :
|
en passant PrintWindow(FindWindow(NULL,"WM_PRINT" ));
avec leur prog (ou nimporte quel autre dailleur), ca ne fonctionne jamais (teste sous WinXP SP2)
qd je paste le bitmap jobtient un rectangle noir
Marsh Posté le 10-08-2005 à 13:52:25
C'est loin d'être aussi simple. Tu peux pas filer un HDC comme ça. C'est un objet GDI, et les objets GDI sont spécifiques à chaque process, ne sont pas partageables.
Selon ton approche, tu peux pas aller plus loin que blitter la fenêtre dans ton HDC, mais si elle est cachee, t'auras pas son contenu.
Relis bien l'article, plusieurs fois, car c'est de la haute voltige. Y'a du subclassing et du thunking.
Marsh Posté le 10-08-2005 à 14:32:58
la seule chose que je fourni ici c le handle de la fenetre et non un hdc
lexemple repris ici (void PrintWindow...) proviens du site jai juste fait un copier-coller
qd a leur histoire d'injection de code c uniquement si la fenetre nest pa capable de traiter ce genre de message hors ici l'utilitaire fourni sur le site le fait
ou alors jai rien compris a ce que tu viens de me dire
Marsh Posté le 10-08-2005 à 17:44:17
Code :
|
hDCMem, c'est un HDC.
L'utilitaire fournit sur le site ne traite pas WM_PRINT.
Marsh Posté le 10-08-2005 à 21:40:03
edit : reflexion en cours
Marsh Posté le 11-08-2005 à 04:52:16
Code :
|
Il y a un petit problème de rafraichissement, mais bon, la flemme de corriger (go to WM_PAINT )
Marsh Posté le 11-08-2005 à 22:09:48
ok merci beacoup jvais regarder a ca
Marsh Posté le 12-08-2005 à 10:33:09
ReplyMarsh Posté le 12-08-2005 à 11:49:55
Le mot capturer à deux sens d'un point de vue gestion des fenêtres sous windows, j'ai pris l'une des deux, la mauvaise apparamment.
Marsh Posté le 12-08-2005 à 13:50:28
ReplyMarsh Posté le 12-08-2005 à 19:25:40
me suis demandé si tu t'etais pa trompé de topic au début , puis bon jme suis dit que le fait de changer le parent d'une fenetre permeterait peut etre de la capturer apres
Marsh Posté le 12-08-2005 à 20:58:45
J'ai lu en diagonal et j'avais la tête dans le c.. (cf l'heure du post), je vais voir si je peut trouver un début de solution pour me rattraper
Marsh Posté le 17-08-2005 à 22:25:21
Y'a un projet qui a l'air abandonné qui peut faire ça :
http://expire.free.fr/board/index. [...] wtopic=114
( demo video là : http://www.logiccubed.com/cgi-bin/ [...] 1100311193 )
Le code permet de récupérer directement la zone memoire utilisé pour le dessin des fenetres.
Je n'ai testé que sous XP, ça fonctionne bien mais le code semble spécifique à la machine ( faut executé un prog : infofetch.exe qui crée un fichier contenant des infos graphiques pour l'execution )
L'exemple fournit est tres simple.
Marsh Posté le 18-08-2005 à 09:49:17
En plus simple y'a la fonction PrintWindow.
Mais c'est dispo qu'à partir de XP...
Marsh Posté le 18-08-2005 à 09:56:02
D'ailleurs il en parle dans son Readme dans le lien que tu donnes, et dit qu'il s'est mis en tête de la coder sous Win2K.
Son soft c'est l'artillerie lourde : il a codé un driver.
J'avais lu des dissussions sur la théorie, mais je conaissais pas de soft non comercial qui l'ai mise en pratique. C'est beaucoup de courage
Dommage qu'il donne pas le code source
Marsh Posté le 18-08-2005 à 22:12:19
J'ai commencé à faire un truc mais par manque de temps, je vous propose cette idée qui me parait assez simple en fait : chercher l'appli que l'on souhaite screenshoter (FindWindow), faire une capture du bureau, récupérer sa position (GetWindowRect), le mettre en avant plan (j'ai une fonction à vous proposer si vous voulez) et recadrer l'image du bureau suivant les positions précédemment récupérées. (BitBlt)
Marsh Posté le 18-08-2005 à 23:28:16
Tu peux par cette même méthode faire une screenshot de la fenêtre voulue uniquement (le bureau est une fenêtre en fait).
Le problème ici c'est d'arriver à capturer le contenu d'une fenêtre partiellement / totalement cachée...
Marsh Posté le 18-08-2005 à 23:51:06
Bah, c'est ce que j'ai tenté d'expliquer : tu fais un screenshot du bureau (oui, je sais que le bureau est une fenêtre) mais en ayant mis en avant plan la fenêtre de l'application que tu souhaites screenshoter, donc la, tu as une image de ton bureau avec la fenêtre en avant plan.
Si ton bureau est en 1024x768 et que la position de la fenêtre que tu as mis en avant plan est à 500, 80, il suffit de créér une deuxième image en ne blittant que la portion de cette fenêtre d'où l'utilité de préalablement récupérer la position de la fenêtre.
Si c'est pas clair la
Marsh Posté le 19-08-2005 à 09:40:32
Citation : ayant mis en avant plan la fenêtre de l'application que tu souhaites screenshoter |
sauf que sa question c'est comment le faire sans mettre en avant plan.
Sinon c'est beaucoup plus simple. Pas besoin de prendre le bureau en screenshot, tu blit le DC de la fenêtre directement, de la même manière que tu blit le DC du bureau.
Marsh Posté le 19-08-2005 à 11:03:50
J'ai relu toute la discussion et je ne vois nul part red faction disant qu'il veut le faire sans mettre la fenêtre en avant plan, il a juste dit toutes les fenêtres, même lorsqu'elles sont en arrière plan, rien ne nous empêche d'utiliser l'avant plan pour récupérer la fenêtre.
Bref, je vais voire s'il est possible de le faire comme tu l'as compris
Marsh Posté le 19-08-2005 à 14:27:42
Moui, c'est vrai, il suffit de mettre au premier plan.
Pour le "comme j'ai dit", c'est simplement comme tu l'a dit, mais en utilisant le HDC de la fenêtre (GetWindowDC(hWnd)) au lieu du bureau (GetDC(NULL)).
Tant qu'on y est, pour les fenêtres video etc... :
http://www.codeproject.com/dialog/screencap.asp
Marsh Posté le 20-08-2005 à 00:18:54
bon jvous montre qd mm a quoi ca va servir
http://membres.lycos.fr/manga4free/test.jpg
l'idée c de remplacer le alt-tab actuel par une version 3d
le screenshot quon voit ici ne correspond pas vraiment au programme,dans la version actuelle les fenetre rangees les une derriere les autres, ici juste un screen shot fait lors d'un test
Marsh Posté le 03-09-2005 à 19:47:58
bon apparament ya pa vraiment moyen de faire qqch
soit lorsque je veux afficher tout les fenetre je les passe en avant plan (vu que yen a une vingtaine + certaines cachees bonjour leffet tout pourri)
ou alors je stoque chaque nouvelle fenetre ouverte dans un bitmap lorsque lutilisateur louvre la premiere fois (nivo ram ca risque detre drole)
Marsh Posté le 08-08-2005 à 23:27:24
je cherche a capturer le contenu d'une fenetre de n'importe quelle application meme si celle si est cachée ou partiellement recouverte
j'ai deja essaye plusieurs pistes ....
Winplosion le fait sans prob que se soit sous xp ou 2000
Message édité par red faction le 09-08-2005 à 17:00:15