Programé une capture d'ecran sous windows

Programé une capture d'ecran sous windows - C - Programmation

Marsh Posté le 02-08-2006 à 20:11:45    

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
Reply

Marsh Posté le 02-08-2006 à 20:11:45   

Reply

Marsh Posté le 03-08-2006 à 00:13:14    

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
Reply

Marsh Posté le 03-08-2006 à 00:25:09    

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);
 

Reply

Marsh Posté le 03-08-2006 à 00:29:10    

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

Reply

Marsh Posté le 03-08-2006 à 11:02:58    

C'est du Windows pur et dur.

Reply

Marsh Posté le 03-08-2006 à 13:35:00    

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
 
 :)

Reply

Marsh Posté le 03-08-2006 à 14:08:05    

=> 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_]

Reply

Marsh Posté le 03-08-2006 à 15:02:03    

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

Reply

Marsh Posté le 03-08-2006 à 15:06:36    

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

Reply

Marsh Posté le 04-08-2006 à 00:12:12    

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
Reply

Marsh Posté le 04-08-2006 à 00:12:12   

Reply

Marsh Posté le 04-08-2006 à 15:22:37    

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.

Reply

Marsh Posté le 04-08-2006 à 15:32:03    

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

Reply

Marsh Posté le 05-08-2006 à 00:09:58    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed