Salut!
Est-il possible de récupérer le dessin contenu dans une fenêtre sans que celle-ci soit obligatoirement au 1er plan ?
Si oui, comment ?
Merci d'avance
Salut!
Est-il possible de récupérer le dessin contenu dans une fenêtre sans que celle-ci soit obligatoirement au 1er plan ?
Si oui, comment ?
Merci d'avance
De retour parmis vous après 10 ans!!
C'est juste une piste
Tu peux chercher du coté de GetDC( HandleHote)
pour obtenir le handle de la zone de dessin,
et après... je sais pas, mais je pense que c'est une piste
Section Delphi
La mine d'or: La FAQ, les Sources
Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
Notre revanche ? l'inverse est aussi vrai ;-)
et après... Tu affectes ce DC à la propriété Handle d'un TCanvas créé manuellement. Ne pas oublier d'appeler ReleaseDC lorsque ton travail est terminé.
sjrd, ancien rédacteur/modérateur Delphi.
Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
Découvrez Mes tutoriels.
Merci pour vos réponses.
Le problème est que j'obtiens une "capture" du bureau de la fenêtre, c'est-à- dire que si une autre fenêtre la superpose, je me retrouve avec une image contenant les 2 fenêtres. Je recherche le moyen de récupérer l'image d'une fenêtre dont je connais le handle même si celle-ci est cachée par une autre, j'espère simplement que cela soit possible au moins.
Merci
De retour parmis vous après 10 ans!!
Bonjour,
Je pense que dans ce cas il est préférable d'utiliser GetDCEx qu'il permet d'éviter les problèmes de clipping sur la zone client.
A lire chez MSDN:
http://msdn.microsoft.com/library/de...vcons_76wo.asp
@+ Claudius
Merci Claudius40 ! Ça semble être le fonction recherchée excepté que je n'arrive pas à l'utiliser comme il faudrait. J'ai essayé plusieurs paramètres, rien n'y fait...
De retour parmis vous après 10 ans!!
Est-ce ce que tu cherches ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Interface //Copier la zone cliente d'une fenêtre dans un bitmap (screenshot de la zone cliente) procedure CopyClientRectToBitmap(WindowHandle:HWND;ABitmap:TBitmap); //Copier l'image d'une fenêtre dans un bitmap (screenshot de toute la fenètre) procedure CopyWindowRectToBitmap(WindowHandle:HWND;ABitmap:TBitmap); //L'espace du bureau procedure ScreenShotDesktop(ABitmap:TBitmap;AScreen:TScreen);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 procedure CopyClientRectToBitmap(WindowHandle:HWND;ABitmap:TBitmap); var WindowDeviceContext: HDC; WindowRect:TRect; begin //La zone cliente de la fenêtre GetClientRect(WindowHandle,WindowRect); //Obtient un contexte de dessin sur la zone cliente de la fenètre WindowDeviceContext:=GetDC(WindowHandle); try with ABitmap do begin with WindowRect do begin Width:=Right-Left; // Ajustement de la taille de l'image Height:=Bottom-top; // pour qu'elle corresponde à celle du bureau end; // Copie dans l'image bitmap BitBlt(Canvas.Handle, 0, 0, Width, Height, WindowDeviceContext, 0, 0, SRCCOPY); end; finally ReleaseDC(WindowHandle, WindowDeviceContext); // Libération du contexte de périphérique end; end; procedure CopyWindowRectToBitmap(WindowHandle:HWND;ABitmap:TBitmap); var WindowDeviceContext: HDC; WindowRect:TRect; begin //Obtenir les limites de la fenètre (bordure+barre de titre comprises) GetWindowRect(WindowHandle,WindowRect); //Obtient un contexte de dessin sur la fenètre WindowDeviceContext:=GetWindowDC(WindowHandle); try with ABitmap do begin with WindowRect do begin Width:=Right-Left; // Ajustement de la taille de l'image Height:=Bottom-top; // pour qu'elle corresponde à celle du bureau end; // Copie dans l'image bitmap BitBlt(Canvas.Handle, 0, 0, Width, Height, WindowDeviceContext, 0, 0, SRCCOPY); end; finally ReleaseDC(WindowHandle, WindowDeviceContext); // Libération du contexte de périphérique end; end; procedure ScreenShotDesktop(ABitmap:TBitmap;AScreen:TScreen); var desktopHandle: THandle; deviceContext: HDC; begin desktopHandle:= GetDesktopWindow; // Récupération du handle du bureau deviceContext:= GetDC(desktopHandle); // Récupération du contexte de périphérique du bureau try Abitmap.Width:= AScreen.Width; // Ajustement de la taille de l'image Abitmap.Height:= AScreen.Height; // pour qu'elle corresponde à celle du bureau BitBlt(Abitmap.Canvas.Handle, 0, 0, Abitmap.Width, Abitmap.Height, deviceContext, 0, 0, SRCCOPY); // Copie du bureau dans l'image bitmap finally ReleaseDC(desktopHandle, deviceContext); // Libération du contexte de périphérique end; end;
Bidouilleuse Delphi
Merci beaucoups pour ce code !
J'ai réalisé un programme qui utilise une image PNG pour dessiner la fenêtre grâce à la fonction UpdateLayeredWindow.
Je n'arrive pas à récupérer la capture, par exemple avec le programme d'une loupe... En résumé, mon programme n'est pas capturable apparemment. Auriez-vous une idée pour résoudre ce problème ?
http://sub0.developpez.com/delphi/pngform2.zip
http://jca.developpez.com/loupe.php
Merci pour vos conseils.
De retour parmis vous après 10 ans!!
Le code ci-dessous fonctionne bien excepté qu'il capture aussi les fenêtres qui sont superposées... Pourtant, j'utilise la fonction CopyWindowRectToBitmap qui a été donnée plus haut :Merci de votre aide!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 procedure TForm1.Timer1Timer(Sender: TObject); var bmp : TBitmap; begin bmp:=TBitmap.Create; bmp.Width := form1.Width; bmp.Height := form1.Height; bmp.PixelFormat := pf32bit; CopyWindowRectToBitmap(windowFromPoint(mouse.CursorPos), bmp); form1.Canvas.Draw(0,0,bmp); bmp.Free; end;
De retour parmis vous après 10 ans!!
Je me suis permis de "retravailler" ton projet, la capture d'écran fonctionne maintenant.
La technique n'est pas aussi sophistiquée que la tienne mais elle fonctionne pour tout les Windows depuis Windows95
Bidouilleuse Delphi
J'aurais bien aimer utiliser ta méthode, mais lorsqu'on éxécute plusieurs fois ton programme et qu'on déplace une fenêtre sur une autre, la partie "transparence" devient opaque...
Peut-être aurais-tu une solution pour ce problème.
De retour parmis vous après 10 ans!!
Salut!
Je suis enfin arrivé à qq chose en m'inspirant de ton code, seulement ça saccade... En tous les cas, la loupe fonctionne cette fois et la fenêtre est bien restaurer si une autre fenêtre modifie le canvas :
http://sub0.developpez.com/delphi/alphaform4.zip
J'espère trouver le moyen d'accélerer le traitement tout en conservant le fonctionnement.
Merci
De retour parmis vous après 10 ans!!
Je crois bien que tu devrais utiliser
BitBlt avec le parametre CAPTUREBLT avec ton programme de loupe....
je crois même qu'il nous faudra tous changer nos facons de faireEnvoyé par MSDN
des captures d'écran de cette facon ...
puisque la semi-transparence deviendra à la mode...
c'est notre désigner Bill et l'arrivé de vista qui nous y forcera un peu...
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Et encore plus simple...suivant le post précédent...
Avec ce code, je capture l'écran...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 const CAPTUREBLT = $40000000; procedure TForm1.TCaptureScreen(Sender: TObject); begin ScreenCanvas := TCanvas.create; ScreenCanvas.Handle := getDC(0); // résupération du canvas de l'écran Screen_bmp:=TBitmap.Create; Screen_bmp.Width:=screen.Width; Screen_bmp.Height:=screen.Height; Screen_bmp.Canvas.CopyMode:=Screen_bmp.Canvas.CopyMode+CAPTUREBLT; Screen_bmp.Canvas.CopyRect(Rect(0, 0, screen.Width, screen.Height), ScreenCanvas,Rect(0, 0, screen.Width, screen.Height)); end;
mais aussi ton application.
Comment dupliquer un disque...ça vous intéresse?
Tutoriel et code source delphi ici
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager