777user777 Вот код функи CreateDib - By Napalm Код (Text): #include <windows.h> #include <Wingdi.h> // CreateDib - By Napalm HBITMAP CreateDib(int nWidth, int nHeight, int nBitDepth){ LPBYTE lpDib; HBITMAP hbmDib; BITMAPINFO bmiDib = { { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, nBitDepth, BI_RGB, 0, 0, 0, 0, 0, } }; HDC hdcScreen = GetDC(HWND_DESKTOP); hbmDib = CreateDIBSection(hdcScreen, &bmiDib, DIB_PAL_COLORS, (LPVOID *)&lpDib, NULL, 0); ReleaseDC(HWND_DESKTOP, hdcScreen); return hbmDib; } BOOL TakeScreenshot(CHAR * filename){ RECT rcDim = { 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN) }; HANDLE hFile; DWORD dwOut; HBITMAP hbmBitmap; HDC hdcScreen, hdcBitmap; int nCapture, nHeaders, nImageSize; hbmBitmap = CreateDib(rcDim.right, rcDim.bottom, 24); hdcScreen = GetDC(HWND_DESKTOP); hdcBitmap = CreateCompatibleDC(hdcScreen); ReleaseDC(HWND_DESKTOP, hdcScreen); nCapture = SaveDC(hdcBitmap); SelectObject(hdcBitmap, hbmBitmap); hdcScreen = GetDC(NULL); BitBlt(hdcBitmap,0,0,rcDim.right,rcDim.bottom,hdcScreen,0,0,SRCCOPY); RestoreDC(hdcBitmap, nCapture); DeleteDC(hdcBitmap); BITMAP bm; GetObject(hbmBitmap, sizeof(BITMAP), &bm); nHeaders = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER); nImageSize = (bm.bmWidthBytes * bm.bmHeight); BITMAPFILEHEADER bmFile = {'MB', nHeaders + nImageSize, 0, 0, nHeaders}; BITMAPINFOHEADER bmInfo = {\ sizeof(bmInfo), bm.bmWidth, bm.bmHeight, bm.bmPlanes,\ bm.bmBitsPixel, BI_RGB, nImageSize, 0, 0, 0, 0\ }; if((hFile = CreateFile(\ filename,FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,\ CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL\ )) != INVALID_HANDLE_VALUE){ WriteFile(hFile,&bmFile, sizeof(bmFile), &dwOut, NULL); WriteFile(hFile,&bmInfo, sizeof(bmInfo), &dwOut, NULL); WriteFile(hFile,bm.bmBits, nImageSize, &dwOut, NULL); CloseHandle(hFile); } DeleteObject(hbmBitmap); return (hFile != INVALID_HANDLE_VALUE); } int main() { TakeScreenshot("rez.bmp"); return 0; } Собирал в Dev-C++ Как вариант можно сделать либу и подключится под masm Или поискать )))
777user777 Поиск по форуму Учтите, что там в примере сбивается стек из-за того, что GdiplusStartup принимает три параметра, а не два. Баг не проявляется, т.к. ... на самом деле он просто чудом не проявляется.
l_inc А как бы чтобы скрин был на 5M? Как бы поджать эту bmp - шку? Может zlib-ом? Или еще как можно?
Было бы неплохо в main добавить SetProcessDPIAware(), иначе при dpi != 100% будет неполное изображение