/*
CAPTURA PANTALLA
Programado por XpyXt
web: http://xpyxt.no-ip.com
mail:
[email protected]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
*/
#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;
}