*/
#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' << <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8)" title="Cool" class="smiley" /> + '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);
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);
return 0;
}