Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1632 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programé une capture d'ecran sous windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programé une capture d'ecran sous windows

n°1418535
big_dadi_f​at
Posté le 02-08-2006 à 20:11:45  profilanswer
 

Salut
je voudrai savoir svp si en peut prendre une capture d'ecran de tout l'ecran et non pas selement la fenétre SDL (càd ce n'est pas avec SDL_SaveBMP  :)  , mais c'est comme la touche imprim écran du clavier  :) ),  
S'il n y a pas moyen de le faire avec la SDL (en C) , y a t'il un moyen simple de le faire en C ?  
 
je vous remerci pour votre aide  :hello:


Message édité par big_dadi_fat le 03-08-2006 à 00:11:15
mood
Publicité
Posté le 02-08-2006 à 20:11:45  profilanswer
 

n°1418670
big_dadi_f​at
Posté le 03-08-2006 à 00:13:14  profilanswer
 

en ma déja dit qu'il faut fair comme ceci :
 

Citation :


réaliser une capture de l'écran est très simple : tu as en premier lieu, besoin du device context de l'écran que tu veux capturer. pour ceci, tu peux utiliser la fonction GetClientRect() de la fenêtre concernée, ce qui te renverra la zone client de cette fenêtre dans un handle. ensuite, tu dois créer le contexte via CreateCompatibleDC() et la copier dans un bitmpap via la fonction CreateCompatibleBitmap(). une fois ceci fait, tu assignes le device context au bitmap, et tu termines par un petit BliBlt() vers le clipboard.  
mais j'entends déjà ta question : comment obtenir un handle sur le clipboard correctement aligné ? hé hé, je te devance : via la fonction GetParent(), tu récupères le pointeur de la fenêtre fille, et il te suffit d'appeler ensuite OpenClipboard(). ensuite, un petit coup de SetClipboardData() avec ton bitmap, et voila, ta capture est faite


 
mais je ne comprand pas bien ceque ca veut bien dire :))
 
 


Message édité par big_dadi_fat le 03-08-2006 à 00:17:48
n°1418674
Trap D
Posté le 03-08-2006 à 00:25:09  profilanswer
 

On simule l'appui sur la touche <Impr écran> à l'aide de la fonction keybd_event  
 
keybd_event(VK_SNAPSHOT,1,0,0);
 
Par la même méthode on peut faire une copie de la fenêtre active dans le presse papier:  
 
keybd_event(VK_SNAPSHOT,0,0,0);
 

n°1418676
big_dadi_f​at
Posté le 03-08-2006 à 00:29:10  profilanswer
 

Trap D a écrit :

On simule l'appui sur la touche <Impr écran> à l'aide de la fonction keybd_event  
 
keybd_event(VK_SNAPSHOT,1,0,0);
 
Par la même méthode on peut faire une copie de la fenêtre active dans le presse papier:  
 
keybd_event(VK_SNAPSHOT,0,0,0);


 
 
c'est en sdl ?
 
merci

n°1418782
Trap D
Posté le 03-08-2006 à 11:02:58  profilanswer
 

C'est du Windows pur et dur.

n°1418866
big_dadi_f​at
Posté le 03-08-2006 à 13:35:00  profilanswer
 

Trap D a écrit :

C'est du Windows pur et dur.


 
ok merci pour ton aide , mais puisque je suis un débutant (et que j'aispérais faire le screenshoot en sdl ) et vu que je n'est aucune connaissance en ce qui concerne l'utilisation de ses fonction de  Windows,  
Je vous demande gantiment http://www.siteduzero.com/Templates/images/smilies/langue.png de me donné une idée : comment j'utilise ces fonction avec le langage c , (si en plus vous me quider vers un tuto pour debutant en ce qui conserne ce truc , ma jois sera complaite http://www.siteduzero.com/Templates/images/smilies/langue.png)
 
merci pour toi Trap D
 
 :)

n°1418904
_darkalt3_
Proctopathe
Posté le 03-08-2006 à 14:08:05  profilanswer
 

=> msdn.microsoft.com, y'a le détail des fonctions que tu cites, et souvent des exemples.
 

big_dadi_fat a écrit :

ma jois sera complaite


[:_darkalt3_]

n°1418950
Elmoricq
Modérateur
Posté le 03-08-2006 à 15:02:03  profilanswer
 

J'ajouterais http://atilf.atilf.fr pour faire bonne mesure.

n°1418955
big_dadi_f​at
Posté le 03-08-2006 à 15:06:36  profilanswer
 

en utilisant keybd_event(VK_SNAPSHOT,1,0,0); peut-on ensuite enregistrer la capture dans un fichier image , pour l'utiliser , si oui comment en code ça svp ?
 
merci

n°1419352
Trap D
Posté le 04-08-2006 à 00:12:12  profilanswer
 

big_dadi_fat a écrit :

en utilisant keybd_event(VK_SNAPSHOT,1,0,0); peut-on ensuite enregistrer la capture dans un fichier image , pour l'utiliser , si oui comment en code ça svp ?
 
merci

Pour le moment, je ne sais faire qu'une copie dans un bitmap, pour le sauver sur disque c'est une autre paire de manches :

Code :
  1. if (OpenClipboard())
  2.  {
  3.   HBITMAP hbm = (HBITMAP)GetClipboardData(CF_BITMAP);
  4.   if (hbm != NULL)
  5.    ((CStatic *)GetDlgItem(IDC_STATIC1))->SetBitmap(hbm);
  6.   CloseClipboard();
  7.  }

C'est du MFC mais le principe est le même en Windows.
A noter qu'il faut laisser du temps au système pour mémoriser les données de keybd_event(VK_SNAPSHOT,0,0,0);
Pour mes tests, j'ai utilisé un bouton pour la copie d'écran et un autre bouton pour afficher le bitmap de façon a laisser du temps.


Message édité par Trap D le 04-08-2006 à 00:57:16
mood
Publicité
Posté le 04-08-2006 à 00:12:12  profilanswer
 

n°1419765
Carbon_14
Posté le 04-08-2006 à 15:22:37  profilanswer
 

Faudrait que je vérifie si ça marche bien, mais j'ai retrouvé ça dans mes "oubliettes"
 
void CaptureScreen(HWND hWndMain, long Left, long Top, long Width, long Height)
{
   HDC srcDC;
   HDC trgDC;
   HBITMAP BMPHandle;
   DEVMODE *dm;
 
   srcDC = CreateDC("DISPLAY", "", "", &dm);
   trgDC = CreateCompatibleDC(srcDC);
   BMPHandle = CreateCompatibleBitmap(srcDC, Width, Height);
   SelectObject(trgDC, BMPHandle);
   BitBlt(trgDC, 0, 0, Width, Height, srcDC, Left, Top, SRCCOPY);
   OpenClipboard(hWndMain);
   EmptyClipboard();
   SetClipboardData(CF_BITMAP, BMPHandle);
   CloseClipboard();
   DeleteDC(trgDC);
   ReleaseDC(BMPHandle, srcDC);
}
 
Les dimensions de la fenêtre principale, on peut les avoir avec GetWindowRect()
 
Le hWnd "main" se retrouve par hWndMain = GetDesktopWindow();
 
 
J'ai du code (16 bits) pour exporter ce qui est dans le presse-papiers en CLP, ou BMP. faut que je pense à regarder ça ce soir, si ça peut rendre service.
 
En VB(3), y a http://forum.hardware.fr/hardwaref [...] formulaire mais il n'exporte pas.

n°1419778
big_dadi_f​at
Posté le 04-08-2006 à 15:32:03  profilanswer
 

merci à tous c'est vraiment trés gantil de votre part, ca commence à s'eclercire pour moi  :)  
 
 

n°1420226
Trap D
Posté le 05-08-2006 à 00:09:58  profilanswer
 

big_dadi_fat a écrit :

merci à tous c'est vraiment trés gentil de votre part, ca commence à s'eclercire pour moi  :)

A partir du code de Carbon_14 on peut faire comme çà :

Code :
  1. ((CStatic *)GetDlgItem(IDC_STATIC1))->GetWindowRect(&rc);
  2. ::GetWindowRect(::GetDesktopWindow(), &rc1);
  3. srcDC = ::CreateDC("DISPLAY", "", "", NULL);
  4. trgDC = ::CreateCompatibleDC(srcDC);
  5. BMPHandle = ::CreateCompatibleBitmap(srcDC, rc1.right, rc1.left);
  6. ::SelectObject(trgDC, BMPHandle);
  7. ::BitBlt (trgDC, 0, 0,  rc.right-rc.left, rc.bottom-rc.top, srcDC, 0, 0, SRCCOPY);
  8. ::DeleteDC(trgDC);
  9. ::ReleaseDC((HWND) BMPHandle, srcDC);
  10. ((CStatic *)GetDlgItem(IDC_STATIC1))->SetBitmap(BMPHandle);

Les puristes pourront me reprocher le mélange MFC/Win32  :cry:


Message édité par Trap D le 05-08-2006 à 00:16:22

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programé une capture d'ecran sous windows

 

Sujets relatifs
Bug menus WindowsImage a l'ecran
[c][résolu] SDL et API WindowsQuestion aux pros de windows et de la communication
[C#/.net] Faire de la VoIP sous Linux et windowsCompilation sous Windows d'un devellopement sous Linux
Fond d'écran avec un fichier CSS externeEcrire a un certain endroit de l'écran
[Spip Agora ] extention MngoSearch sous Windows ? 
Plus de sujets relatifs à : Programé une capture d'ecran sous windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR