Captura de pantalla (Zonas determinadas)

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

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante 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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
mail: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


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