Captura de pantalla (Zonas determinadas)

Iniciado por ANTRAX, Mayo 22, 2011, 09:47:37 PM

Tema anterior - Siguiente tema

0 Miembros y 6 Visitantes están viendo este tema.

Mayo 22, 2011, 09:47:37 PM Ultima modificación: Febrero 08, 2014, 06:08:31 PM por Expermicid
/*
CAPTURA PANTALLA
Programado por XpyXt
web: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
mail: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Licencia de implementacion: publico este source bajo GPL, es decir, si tu
usas este codigo fuente en algun programa deberas publicar su source. Como
me entere de que lo has usado y no has publicado el codigo fuente voy a tu
casa y te amputo las manos. ¿Entendido?

Explicacion y modo de uso: Este source nos captura la pantalla del windows,
Hay 3 arrays de datos, 2 cabeceras del BMP y el RAW del bmp.


array CBA1 &bfh, Tamaño de la CBA1 sizeof(bfh)
array CBA2 &bmi.bmiHeader, Tamaño de la CBA2 sizeof(BITMAPINFOHEADER)
array (char *)pbBits, Tamaño del RAW bmi.bmiHeader.biSizeImage

--------------------
Modificado por Lympex para poder hacer capturas de una determinada zona de la pantalla

Código: c
*/
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#include <wingdi.h>

typedef struct _CAPTURA_
{
        char Ruta[MAX_PATH];
        bool PantallaCompleta;
        unsigned int Alto;
unsigned int Ancho;
unsigned int OrigenX;
unsigned int OrigenY;
}CAPTURA;

void Capturar(CAPTURA *datos)
{
BITMAPINFO bmi;
BITMAPFILEHEADER bfh;
     
     unsigned int Ancho,Ancho1;
     unsigned int Alto,Alto1;
     HWND hWnd;
     HDC hdc ;
     HDC memDC;
     HBITMAP hbm ;
     HBITMAP hbmOld;
     BYTE *pbBits;
     
     HANDLE hfile;
     DWORD dwWritten;
     
     Ancho1 = GetSystemMetrics(SM_CXSCREEN);
     Alto1 = GetSystemMetrics(SM_CYSCREEN);

     if(datos->PantallaCompleta==true)
     {
datos->Ancho=Ancho1;
datos->Alto=Alto1;
     }else{
//para no salirnos de la pantalla, reajustamos los valores si es necesario
if((datos->Ancho+datos->OrigenX)>Ancho1)
datos->Ancho=Ancho1-datos->OrigenX;

if((datos->Alto+datos->OrigenY)>Alto1)
datos->Alto=Alto1-datos->OrigenY;

Alto=datos->Alto;
Ancho=datos->Ancho;
     }

     hWnd = GetDesktopWindow();
     hdc = GetDC(hWnd);
     memDC = CreateCompatibleDC(hdc);
     hbm = CreateCompatibleBitmap(hdc, datos->Ancho, datos->Alto);
     hbmOld = (HBITMAP)SelectObject(memDC, hbm);
     
     if(datos->PantallaCompleta==true)
     BitBlt(memDC, 0, 0, datos->Ancho, datos->Alto, hdc, 0, 0, SRCCOPY);
     else
     BitBlt(memDC, 0, 0, datos->Ancho, datos->Alto, hdc, datos->OrigenX,datos->OrigenY, SRCCOPY);
     
     ZeroMemory(&bmi, sizeof(bmi));
     bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
     bmi.bmiHeader.biWidth = datos->Ancho;
     bmi.bmiHeader.biHeight = datos->Alto;
     bmi.bmiHeader.biBitCount = 24;
     bmi.bmiHeader.biPlanes = 1;
     bmi.bmiHeader.biCompression = BI_RGB;
     bmi.bmiHeader.biSizeImage = 32 * datos->Ancho * datos->Alto / 8;

     pbBits = (BYTE*)malloc(bmi.bmiHeader.biSizeImage*sizeof(bmi.bmiHeader.biSizeImage));

     GetDIBits(memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS );

     bfh.bfType = ('M' << 8) + 'B';
     bfh.bfSize = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER);
     bfh.bfReserved1 = 0;
     bfh.bfReserved2 = 0;
     bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

     //(char *)pbBits // string de datos imagen sin cabezeras
     //guardamos en el fichero
     hfile = CreateFile(datos->Ruta,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0);
     WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL);
     WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
     WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL);
     CloseHandle(hfile);

     SelectObject(memDC, hbmOld);
     DeleteDC(memDC);
     ReleaseDC(hWnd,hdc);
     DeleteObject(hbm);

     free(pbBits);

return;
}

int main()
{
    CAPTURA datos;
   
    //CAPTURAMOS LA PANTALLA COMPLETA
    memset(&datos,0,sizeof(CAPTURA));
    strcpy(datos.Ruta,"PantallaCompleta.bmp");
    datos.PantallaCompleta=true;
    Capturar(&datos);
   
    //CAPTURAMOS UNA REGION DE LA PANTALLA
    memset(&datos,0,sizeof(CAPTURA));
    strcpy(datos.Ruta,"Region.bmp");
    datos.OrigenX=datos.OrigenY=500;//Coordenadas X e Y (en la pantalla) del ángulo superior izquierdo de nuestro rectángulo
    datos.Alto=500;//Altura de nuestro rectángulo
    datos.Ancho=3000;//Anchura de nuestro rectángulo
    datos.PantallaCompleta=false;//Capturar una región
    Capturar(&datos);
   
    system("pause");
    return 0;
}