抓屏示例

以下示例程序功能为:抓取整个屏幕并保存为D:\\1234.bmp
  1. #include <windows.h>   
  2. #include <iostream>   
  3.   
  4. using namespace std;  
  5.   
  6. //   
  7. // 抓取屏幕图像存入DDB位图   
  8. //   
  9. HBITMAP CaptureScreenToDDB()  
  10. {  
  11.     HDC hdcScreen = NULL;  
  12.     HDC hdcMem = NULL;  
  13.     HBITMAP hBitmap = NULL;  
  14.     HBITMAP hOldBitmap = NULL;  
  15.     int xScreenRes = 0;  
  16.     int yScreenRes = 0;  
  17.   
  18.     // 创建屏幕设备描述表   
  19.     hdcScreen = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);  
  20.   
  21.     // 获取屏幕分辨率   
  22.     xScreenRes = ::GetDeviceCaps(hdcScreen, HORZRES);  
  23.     yScreenRes = ::GetDeviceCaps(hdcScreen, VERTRES);  
  24.   
  25.     // 创建位图并拷贝屏幕至位图   
  26.     hdcMem = ::CreateCompatibleDC(hdcScreen);  
  27.     hBitmap = ::CreateCompatibleBitmap(hdcScreen, xScreenRes, yScreenRes);  
  28.     hOldBitmap = (HBITMAP)::SelectObject(hdcMem, hBitmap);  
  29.     ::BitBlt(hdcMem, 0, 0, xScreenRes, yScreenRes, hdcScreen, 0, 0, SRCCOPY);  
  30.     hBitmap = (HBITMAP)::SelectObject(hdcMem, hOldBitmap);  
  31.   
  32.     // 释放资源   
  33.     ::DeleteDC(hdcMem);  
  34.     ::DeleteDC(hdcScreen);  
  35.   
  36.     return hBitmap;  
  37. }  
  38.   
  39. //   
  40. // 保存DDB位图成本地DIB位图文件   
  41. //   
  42. int SaveDDBToFile(HBITMAP hBitmap, HDC hdc, TCHAR name[])  
  43. {  
  44.     // 获取位图信息   
  45.     BITMAP bm;  
  46.     ::GetObject(hBitmap, sizeof(bm), &bm);  
  47.   
  48.     // 计算位图文件每个字节所占的bit数   
  49.     int iBitsPixel = bm.bmBitsPixel * bm.bmPlanes;  
  50.     if (iBitsPixel < 24)  
  51.         return -1;  
  52.   
  53.     // 位图信息头结构    
  54.     BITMAPINFOHEADER bmih = { 0 };  
  55.     bmih.biSize = sizeof(bmih);  
  56.     bmih.biWidth = bm.bmWidth;  
  57.     bmih.biHeight = bm.bmHeight;  
  58.     bmih.biPlanes = 1;  
  59.     bmih.biBitCount = iBitsPixel;  
  60.     bmih.biCompression = BI_RGB;  
  61.     bmih.biSizeImage = 0;  
  62.     bmih.biXPelsPerMeter = 0;  
  63.     bmih.biYPelsPerMeter = 0;  
  64.     bmih.biClrUsed = 0;  
  65.     bmih.biClrImportant = 0;  
  66.   
  67.     // 调色板   
  68.     DWORD dwPaletteSize = 0;  
  69.   
  70.     // 创建DIB位图内容   
  71.     DWORD dwSize = ((bm.bmWidth * iBitsPixel + 31) / 32) * 4 * bm.bmHeight;  
  72.     DWORD dwDIBSize = sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwSize;  
  73.     LPVOID lpDIB = ::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, dwDIBSize);  
  74.     LPBITMAPINFOHEADER lpbmih = (LPBITMAPINFOHEADER)lpDIB;  
  75.     *lpbmih = bmih;  
  76.     ::GetDIBits(hdc, hBitmap, 0, bm.bmHeight, (char*)lpDIB + sizeof(BITMAPINFOHEADER) + dwPaletteSize,  
  77.         (PBITMAPINFO)lpbmih, DIB_RGB_COLORS);  
  78.       
  79.     // 位图文件头   
  80.     BITMAPFILEHEADER bmfh;  
  81.     bmfh.bfType = 0x4d42;  
  82.     bmfh.bfSize = sizeof(BITMAPFILEHEADER) + dwDIBSize;  
  83.     bmfh.bfReserved1 = 0;  
  84.     bmfh.bfReserved2 = 0;  
  85.     bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize;  
  86.   
  87.     // 创建.bmp文件并保存   
  88.     HANDLE hFile = ::CreateFile(name,  
  89.         GENERIC_WRITE,  
  90.         0,  
  91.         NULL,  
  92.         CREATE_ALWAYS,  
  93.         FILE_ATTRIBUTE_NORMAL,  
  94.         NULL);  
  95.     if (INVALID_HANDLE_VALUE == hFile)  
  96.         return GetLastError();  
  97.   
  98.     DWORD dwWritten = 0;  
  99.     ::WriteFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);  
  100.     ::WriteFile(hFile, lpDIB, dwDIBSize, &dwWritten, NULL);  
  101.   
  102.     ::HeapFree(::GetProcessHeap(), 0, lpDIB);  
  103.     ::CloseHandle(hFile);  
  104.   
  105.     return 0;  
  106. }  
  107.   
  108. int main()  
  109. {  
  110.     HDC hdcScreen = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);  
  111.     HBITMAP hBitmapScreen = CaptureScreenToDDB();  
  112.     if (hBitmapScreen == NULL)  
  113.     {  
  114.         cout << "CaptureScreenToDDB() failed." << endl;  
  115.         return -1;  
  116.     }  
  117.     TCHAR name[] = TEXT("d:\\1234.bmp");  
  118.   
  119.     cout << SaveDDBToFile(hBitmapScreen, hdcScreen, name) << endl;  
  120.   
  121.     cout << "Hello Kitty" << endl;  
  122.     system("pause");  
  123. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值