Screenshoot zone precise

Résolu
nicolovitch Messages postés 20 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 5 juin 2007 - 1 mai 2007 à 19:55
nicolovitch Messages postés 20 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 5 juin 2007 - 1 mai 2007 à 22:01
Bonjour à tous,


Je cherche depuis plusieurs mois à faire un programme qui puisse faire un imprim ecran d'une zone précise, j'ai réussi avec l'aide d'un membre du forum à développer le programme suivant qui fait un imprim ecran de la fenêtre qui est au premier plan, de plus on peut indiquer la largeur et la hauteur de l'imprim ecran à partir du coin en haut à gauche de la fenêtre, mais maintenant ce que je voudrais faire, c'est un screenshot mais à partir d'un point choisit et non uniquement à partir du coin en haut à gauche, un screenshoot d'une zone choisie entièrement .


Comment puis je faire ???

Modifier le programme suivant ou faire un nouveau programme ???


#include <stdio.h>
#include <conio.h>
#include <windows.h>


int hwnd_to_bmp(HWND hwnd, char *pszflname)
{
  HDC memdc;
  HANDLE hfl;
  DWORD dwBytes, dwNumColors;
  void *pBits;
  HBITMAP hbmp;
  BITMAPFILEHEADER fileheader;
  BITMAPINFOHEADER infoheader;
  RGBQUAD colors[256];
  BITMAPINFO bmpinfo;
  HGDIOBJ hret;
  RECT rct;




  HDC hdc = GetDC(hwnd);
  printf("le handle de la fenêtre au premier plan est : 0x%X\n",hdc);
  printf("le chemin est pszflname : %s\n",pszflname);




  GetWindowRect(hwnd, &amp;rct);
 // rct.bottom -= rct.top + 50;
 // rct.right -= rct.left + 15;
  rct.bottom -= rct.top + 300;
  rct.right -= rct.left + 600;
  rct.top = GetDeviceCaps(hdc, BITSPIXEL);
  if(rct.top <= 8)
    dwNumColors = 256;
  else
    dwNumColors = 0;
  if(!(memdc = CreateCompatibleDC(hdc)))
    goto relHwndDc;


  bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmpinfo.bmiHeader.biWidth = rct.right;
  bmpinfo.bmiHeader.biHeight = rct.bottom;
  bmpinfo.bmiHeader.biPlanes = 1;
  bmpinfo.bmiHeader.biBitCount = (WORD) rct.top;
  bmpinfo.bmiHeader.biCompression = BI_RGB;
  bmpinfo.bmiHeader.biSizeImage = 0;
  bmpinfo.bmiHeader.biXPelsPerMeter = 0;
  bmpinfo.bmiHeader.biYPelsPerMeter = 0;
  bmpinfo.bmiHeader.biClrUsed = dwNumColors;
  bmpinfo.bmiHeader.biClrImportant = dwNumColors;
  hbmp = CreateDIBSection(hdc, &amp;bmpinfo, DIB_PAL_COLORS, &amp;pBits, NULL, 0);


  if(!hbmp) goto errato;
  hret = SelectObject(memdc, hbmp);
  if(!hret || (hret == HGDI_ERROR)) goto errato;


  if(!BitBlt(memdc, 0, 0, rct.right, rct.bottom, hdc, 0, 0, SRCCOPY)) goto errato;
  if(dwNumColors)
    dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);


  fileheader.bfType = 0x4D42;
  rct.left = dwNumColors * sizeof(RGBQUAD);
  fileheader.bfSize = ((rct.right * rct.bottom * rct.top) >> 3) + rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);  fileheader.bfReserved1 fileheader.bfReserved2 0;
  fileheader.bfOffBits = rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  infoheader.biSize = sizeof(BITMAPINFOHEADER);
  infoheader.biWidth = rct.right;
  infoheader.biHeight = rct.bottom;
  infoheader.biPlanes = 1;
  infoheader.biBitCount = (WORD) rct.top;
  infoheader.biCompression = BI_RGB;  infoheader.biSizeImage infoheader.biClrImportant 0;  infoheader.biXPelsPerMeter infoheader.biYPelsPerMeter 0;
  infoheader.biClrUsed = dwNumColors;


  hfl = CreateFile(pszflname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if (hfl == INVALID_HANDLE_VALUE) {DeleteObject(hbmp); goto errato;}
  WriteFile(hfl, &amp;fileheader, sizeof(BITMAPFILEHEADER), &amp;dwBytes, 0);
  WriteFile(hfl, &amp;infoheader, sizeof(BITMAPINFOHEADER), &amp;dwBytes, 0);
  if(!dwNumColors)
    WriteFile(hfl, colors, rct.left, &amp;dwBytes, 0);
  WriteFile(hfl, pBits, (rct.right * rct.bottom * rct.top) >> 3, &amp;dwBytes, 0);
  CloseHandle(hfl);
  DeleteObject(hbmp);
  DeleteDC(memdc);
  return 1;
  errato:
  DeleteDC(memdc);
  relHwndDc:
  ReleaseDC(hwnd, hdc); return 0;
} 


void main (void)
{
HWND hFore = GetForegroundWindow();
hwnd_to_bmp(hFore,"C:/test1.bmp");
}



merci d'avance pour votre aide !!

1 réponse

nicolovitch Messages postés 20 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 5 juin 2007
1 mai 2007 à 22:01
<hr style="COLOR: #d1d1e1" size="1" />
<!-- / icon and title -->
<!-- message -->

résolu apres avoir choisi la taille de la sous-image à sauvegarder, le placement est très facile: Il suffit de régler convenablement les paramètres 6 et 7 (nXSrc et nYSrc) de BitBlt()...
3
Rejoignez-nous