以下示例程序功能为:抓取整个屏幕并保存为D:\\1234.bmp
#include <windows.h> #include <iostream> using namespace std; // // 抓取屏幕图像存入DDB位图 // HBITMAP CaptureScreenToDDB() { HDC hdcScreen = NULL; HDC hdcMem = NULL; HBITMAP hBitmap = NULL; HBITMAP hOldBitmap = NULL; int xScreenRes = 0; int yScreenRes = 0; // 创建屏幕设备描述表 hdcScreen = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); // 获取屏幕分辨率 xScreenRes = ::GetDeviceCaps(hdcScreen, HORZRES); yScreenRes = ::GetDeviceCaps(hdcScreen, VERTRES); // 创建位图并拷贝屏幕至位图 hdcMem = ::CreateCompatibleDC(hdcScreen); hBitmap = ::CreateCompatibleBitmap(hdcScreen, xScreenRes, yScreenRes); hOldBitmap = (HBITMAP)::SelectObject(hdcMem, hBitmap); ::BitBlt(hdcMem, 0, 0, xScreenRes, yScreenRes, hdcScreen, 0, 0, SRCCOPY); hBitmap = (HBITMAP)::SelectObject(hdcMem, hOldBitmap); // 释放资源 ::DeleteDC(hdcMem); ::DeleteDC(hdcScreen); return hBitmap; } // // 保存DDB位图成本地DIB位图文件 // int SaveDDBToFile(HBITMAP hBitmap, HDC hdc, TCHAR name[]) { // 获取位图信息 BITMAP bm; ::GetObject(hBitmap, sizeof(bm), &bm); // 计算位图文件每个字节所占的bit数 int iBitsPixel = bm.bmBitsPixel * bm.bmPlanes; if (iBitsPixel < 24) return -1; // 位图信息头结构 BITMAPINFOHEADER bmih = { 0 }; bmih.biSize = sizeof(bmih); bmih.biWidth = bm.bmWidth; bmih.biHeight = bm.bmHeight; bmih.biPlanes = 1; bmih.biBitCount = iBitsPixel; bmih.biCompression = BI_RGB; bmih.biSizeImage = 0; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrUsed = 0; bmih.biClrImportant = 0; // 调色板 DWORD dwPaletteSize = 0; // 创建DIB位图内容 DWORD dwSize = ((bm.bmWidth * iBitsPixel + 31) / 32) * 4 * bm.bmHeight; DWORD dwDIBSize = sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwSize; LPVOID lpDIB = ::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, dwDIBSize); LPBITMAPINFOHEADER lpbmih = (LPBITMAPINFOHEADER)lpDIB; *lpbmih = bmih; ::GetDIBits(hdc, hBitmap, 0, bm.bmHeight, (char*)lpDIB + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (PBITMAPINFO)lpbmih, DIB_RGB_COLORS); // 位图文件头 BITMAPFILEHEADER bmfh; bmfh.bfType = 0x4d42; bmfh.bfSize = sizeof(BITMAPFILEHEADER) + dwDIBSize; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize; // 创建.bmp文件并保存 HANDLE hFile = ::CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) return GetLastError(); DWORD dwWritten = 0; ::WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); ::WriteFile(hFile, lpDIB, dwDIBSize, &dwWritten, NULL); ::HeapFree(::GetProcessHeap(), 0, lpDIB); ::CloseHandle(hFile); return 0; } int main() { HDC hdcScreen = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); HBITMAP hBitmapScreen = CaptureScreenToDDB(); if (hBitmapScreen == NULL) { cout << "CaptureScreenToDDB() failed." << endl; return -1; } TCHAR name[] = TEXT("d:\\1234.bmp"); cout << SaveDDBToFile(hBitmapScreen, hdcScreen, name) << endl; cout << "Hello Kitty" << endl; system("pause"); }