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

 


Dernière réponse
Sujet : Programé une capture d'ecran sous windows
Trap D

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Trap D

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:

big_dadi_fat merci à tous c'est vraiment trés gantil de votre part, ca commence à s'eclercire pour moi  :)  
 
 
Carbon_14 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.
Trap D

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.

big_dadi_fat 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
Elmoricq J'ajouterais http://atilf.atilf.fr pour faire bonne mesure.
_darkalt3_ => 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_]

big_dadi_fat

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/Template [...] 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/Template [...] langue.png )
 
merci pour toi Trap D
 
 :)

Trap D C'est du Windows pur et dur.
big_dadi_fat

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

Trap D 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);
 
big_dadi_fat 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 :))
 
 

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

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