#include <windows.h>
#include <stdio.h>
static int w, h;
static void * p;
static char * name="screen.bmp";
void SaveBitmap(char *name,HBITMAP bitmap)
{
HDC hdcScreen; // Контекст устройства экрана
HWND hwndScreen; // Дескриптор окна рабочего стола
int i; // Количество выбираемых линий
BYTE *bits; // Указатель на массив битов изображения
BITMAPINFOHEADER *info; // Информационная структура изображения
HANDLE fp; // Дескриптор файла
BITMAPFILEHEADER finfo; // Заголовок файла изображения
long ctsize,imgsize,pixels;// Различные размерности для записи файла
DWORD dw; // Код возврата
char *ptr; // Указатель используемый для записи открытого BM
// Получаем дескриптор рабочего стола
hwndScreen=GetDesktopWindow();
// Получаем контекст устройства рабочего стола
hdcScreen = GetDC( hwndScreen );
// Выделяем память под структуру с информацией о изображении
info = (BITMAPINFOHEADER*)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPFILEHEADER)+(1024*sizeof(RGBQUAD)));
info->biSize = sizeof(BITMAPINFOHEADER);
info->biBitCount = 0;
// Заполняем структуру информацией о изображении
i = GetDIBits( hdcScreen, // дескриптор контекста устройства
bitmap, // дескриптор изображения
0, // первая строка развертки, которая должна быть выбрана
0, // число копируемых линий
NULL, // адрес массива для битов изображения
(BITMAPINFO*)info, // адрес структуры для данных изображения
DIB_RGB_COLORS // RGB или индекс палитры
);
// Определяем количество бит на пиксель.
if( (info->biBitCount!=4) &&
(info->biBitCount!=8) &&
(info->biBitCount!=24) )
info->biBitCount=24;
// Указываем что изображение не сжато
info->biCompression=BI_RGB;
// Получаем количество пикселей
pixels=info->biWidth*info->biHeight;
switch(info->biBitCount)
{
case 4:ctsize=16;imgsize=pixels/2;break;
case 8:ctsize=256;imgsize=pixels;break;
case 16:ctsize=0;imgsize=pixels*2;break;
case 24:ctsize=0;imgsize=pixels*3;break;
case 32:ctsize=0;imgsize=pixels*4;break;
default:
ReleaseDC( hwndScreen,hdcScreen );
}
// Инициализируем массив для битов изображения
bits = (unsigned char*)GlobalAlloc(GMEM_FIXED,imgsize);
//Заполняем массив битов изображения
i = GetDIBits( hdcScreen, // дескриптор контекста устройства
bitmap, // дескриптор изображения
0, // первая выбираемая линия для изображения назначения
info->biHeight, // количество выбираемых линий
bits, // адрес массива битов изображения
(BITMAPINFO*)info,// адрес структуры с данными изображения
DIB_RGB_COLORS // RGB или индекс палитры
);
// Формируем заголовок файла
ptr = (char *)&finfo.bfType;
ptr[0]='B';
ptr[1]='M';
//Определяем сдвиг от начала структуры BITMAPFILEHEADER до массива бит
finfo.bfOffBits=sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)+
(sizeof(RGBQUAD)*ctsize);
// Размер файла изображения в байтах
finfo.bfSize=finfo.bfOffBits+imgsize;
finfo.bfReserved1=0;
finfo.bfReserved2=0;
//Создаем файл для изображения
fp = CreateFile(name, // указатель с именем файла
GENERIC_WRITE, // режим доступа
0, // режим использования
NULL, // указатель на параметры безопасности
CREATE_ALWAYS, // метод создания
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,// атрибуты файла
NULL
);
// Записываем структуру заголовка файла
WriteFile(fp,&finfo,sizeof(BITMAPFILEHEADER),&dw,NULL);
// Записываем структуру информации изображения
WriteFile(fp,info,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*ctsize,&dw,NULL);
// Записываем биты изображения
WriteFile(fp,bits,imgsize,&dw,NULL);
// Закрываем файл
CloseHandle(fp);
//Освобождаем память с информацией изображения
GlobalFree(info);
// Освобождаем память с битами изображения
GlobalFree(bits);
// Освобождаем контекст устройства
ReleaseDC( hwndScreen,hdcScreen );
}
int main()
{
HDC hdc;
HBITMAP dib;
BITMAPINFOHEADER bi;
w = GetSystemMetrics( SM_CXSCREEN );
h = GetSystemMetrics( SM_CYSCREEN );
bi.biSize = sizeof( BITMAPINFOHEADER );
bi.biWidth = w;
bi.biHeight = -h;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
hdc = CreateCompatibleDC( NULL );
dib = CreateDIBSection( hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, NULL, NULL, 0 );
SaveBitmap(name,dib);
return 0;
}