Ideas claras, código principal, buscando un programa completo.
Hay algunos errores en el código, te ayudaré a corregirlos:
#include lt; windows.hgt
#include atltypes. hgt;
HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect representa el área seleccionada
{
HDC hScrDC, hMemDC
/ / Tabla de descripción del dispositivo de memoria y pantalla
HBITMAP hBitmap, hOldBitmap;
// Mango de mapa de bits
int nX, nY, nX2, nY2;
// Coordenadas del área seleccionada
int nWidth, nHeight;
// Ancho y alto del mapa de bits
int xScrn, yScrn; p> // Resolución de pantalla
// Asegúrese de que el área seleccionada no sea un rectángulo vacío
if (IsRectEmpty(lpRect))
return NULL; /p>
//Crea una tabla de descripción de dispositivo para la pantalla
hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL
//Describe el screen device Table crea una tabla de descripción de dispositivos de memoria compatibles
hMemDC = CreateCompatibleDC(hScrDC
// Obtiene las coordenadas del área seleccionada
nX = lpRect); -gt; izquierda ;
nY = lpRect-gt; arriba;
nX2 = lpRect-gt;
// Obtener la resolución de la pantalla
xScrn = GetDeviceCaps(hScrDC, HORZRES
yScrn = GetDeviceCaps(hScrDC, VERTRES); p> // Asegúrate de que el área seleccionada sea visible
if (nX lt; 0)
nX = 0
if (nY lt; 0)
nY = 0;
si (nX2 gt; xScrn)
nX2 = xScrn
si (nY2 gt; yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY
// Crear un contexto de dispositivo compatible con el mapa de bits de pantalla
hBitmap=CreateCompatibleBitmap(hScrDC, n
Ancho, nHeight);
//Seleccione el nuevo mapa de bits en la tabla de descripción del dispositivo de memoria
hOldBitmap=(HBITMAP)SelectObject(hMemDC, hBitmap); //Copia la tabla de contexto del dispositivo de pantalla a la tabla de contexto del dispositivo de memoria
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY
/ /Obtener el identificador del mapa de bits de la pantalla
hBitmap=(HBITMAP)SelectObject(hMemDC, hOldBitmap
//Borrar
DeleteDC(hScrDC); /p>
DeleteDC(hMemDC);
// Devuelve el identificador del mapa de bits
return hBitmap
}
int SaveBitmapToFile; (HBITMAP hBitmap, LPCWSTR lpFileName) //hBitmap es el identificador del mapa de bits de la pantalla en este momento
{ //lpFileName es el nombre del archivo de mapa de bits
HDC hDC
//Tabla de descripción del dispositivo
int iBits
//El número de bytes ocupados por cada píxel bajo la resolución de pantalla actual
WORD wBitCount
p>
//El número de bytes ocupados por cada píxel en el mapa de bits
//Definir el tamaño de la paleta, el tamaño de bytes de los píxeles en el mapa de bits, el tamaño del archivo de mapa de bits y escriba las palabras del archivo Número de secciones
DWORD dwPaletteSize=0, dwBmBitsSize, dwDIBSize, dwWritten
BITMAP Bitmap
//Estructura de atributos de mapa de bits<; /p>
BITMAPFILEHEADER bmfHdr;
//Estructura del encabezado del archivo de mapa de bits
BITMAPINFOHEADER bi
//Estructura del encabezado de la información del mapa de bits
LPBITMAPINFOHEADER lpbi
// Señala la estructura del encabezado de información del mapa de bits
HANDLE fh, hDib, hPal
HPALETTE hOldPal=NULL
//Definir archivo, asignar identificador de memoria, identificador de paleta
//Calcular el número de bytes ocupados por cada píxel del archivo de mapa de bits
hDC = CreateDC(L" DISPLAY", NULL , NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(
hDC);
si (iBits lt; = 1)
wBitCount = 1
si no (iBits lt; = 4)
wBitCount = 4;
más si (iBits lt; = 8)
wBitCount = 8
más si (iBits lt; = 24)
wBitCount = 24;
else
wBitCount = 32
//Calcular el tamaño de la paleta
if ( wBitCount lt; = 8)
dwPaletteSize=(1 lt; lt; wBitCount)*sizeof(RGBQUAD);
//Establece la estructura del encabezado de información del mapa de bits
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap
bi.biSize = sizeof(BITMAPINFOHEADER
bi.biWidth = Bitmap.bmWidth ; >
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount
bi .biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0; = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth*wBitCount 31)/32)*4*Bitmap.bmHeight; > p>
//Asignar memoria para el contenido del mapa de bits
/*xxxxxxxx Calcular el tamaño del mapa de bits y descomponerlo (explica la declaración anterior)xxxxxxxxxxxxxxxxxxxx
//Cada línea de escaneo El número de bytes ocupados debe ser un múltiplo entero de 4. El algoritmo específico es:
int biWidth = (Bitmap.bmWidth*wBitCount) / 32
if((Bitmap. bmWidth *wBitCount) 32)
biWidth; // No es un múltiplo entero más 1
biWidth *= 4; // En este punto, los bytes calculados de cada número de línea de escaneo.
dwBmBitsSize = biWidth * Bitmap.bmHeight; //Obtener el tamaño
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
hDib = GlobalAlloc(GHND, dwBmBitsSize dwPaletteSize sizeof(BITMAPINFOHEADER)) ;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib
*lpbi = bi
// Paleta de proceso
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL
hOldPal= SelectPalette); (hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC)
}
// Obtener nuevos píxeles bajo este valor de paleta
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi sizeof(BITMAPINFOHEADER) dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS
/ /Restaurar paleta<); /p>
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE
RealizePalette(hDC
);::ReleaseDC(NULL, hDC);
}
//Crear archivo de mapa de bits
fh=CreateFile( lpFileName, GENERIC_WRITE, 0, NULL , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh==INVALID_HANDLE_VALUE)
return FALSE
// Establece el encabezado del archivo de mapa de bits p>
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize=sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) dwPaletteSize dwBmBitsSize
bmfHdr.bfSize = dwDIBSize; /p>
bmfHdr.bfReservado1 = 0;
bmfHdr.bfReservado
ed2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) (DWORD)sizeof(BITMAPINFOHEADER) dwPaletteSize
// Escribir encabezado de archivo de mapa de bits
WriteFile(fh, (LPSTR) & bmfHdr, sizeof(BITMAPFILEHEADER), & dwWritten, NULL
// Escribe el resto del archivo de mapa de bits
WriteFile (fh, ( LPSTR)lpbi, sizeof(BITMAPINFOHEADER) dwPaletteSize dwBmBitsSize, amp; dwWritten, NULL
//Borrar
GlobalUnlock(hDib)
GlobalFree(hDib);
CloseHandle(fh);
devuelve VERDADERO
}
int main(void) p>
{
RECT rect;
rect.left = 0;
rect.top = 0
rect .right = GetSystemMetrics (SM_CXSCREEN);
rect.bottom = GetSystemMetrics(SM_CYSCREEN);
HBITMAP hMap = CopyScreenToBitmap(amp;rect);
SaveBitmapToFile( hMap, L"); C:\\seu07201213(HOHO).bmp");
devuelve 0;
}