打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC,C++实现后台截屏

在两篇文章基础上有修改,建立MFC工程,代码直接可用

  1. void screenShot() {
  2. //判断是不是窗口句柄如果是的话不能使用GetDC来获取DC 不然截图会是黑屏
  3. HWND hwnd = ::GetDesktopWindow();
  4. HDC pDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
  5. int BitPerPixel = ::GetDeviceCaps(pDC, BITSPIXEL);//获得颜色模式
  6. int left = 0, top = 0; // 截屏左上角起点
  7. int width = ::GetDeviceCaps(pDC, HORZRES); //设置图像宽度全屏
  8. int height = ::GetDeviceCaps(pDC, VERTRES); //设置图像高度全屏
  9. HDC memDC;//内存DC
  10. memDC = ::CreateCompatibleDC(pDC);
  11. HBITMAP memBitmap, oldmemBitmap;//建立和屏幕兼容的bitmap
  12. memBitmap = ::CreateCompatibleBitmap(pDC, width, height);
  13. oldmemBitmap = (HBITMAP)::SelectObject(memDC, memBitmap);//将memBitmap选入内存DC
  14. if (hwnd == ::GetDesktopWindow()) {
  15. BitBlt(memDC, 0, 0, width, height, pDC, left, top, SRCCOPY);//图像宽度高度和截取位置
  16. } else {
  17. bool bret = ::PrintWindow(hwnd, memDC, PW_CLIENTONLY);
  18. if (!bret) {
  19. BitBlt(memDC, 0, 0, width, height, pDC, left, top, SRCCOPY);//图像宽度高度和截取位置
  20. }
  21. }
  22. //以下代码保存memDC中的位图到文件
  23. BITMAP bmp;
  24. ::GetObject(memBitmap, sizeof(BITMAP), &bmp);;//获得位图信息

  25. BITMAPINFOHEADER bih = { 0 };//位图信息头
  26. bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
  27. bih.biCompression = BI_RGB;
  28. bih.biHeight = bmp.bmHeight;//高度
  29. bih.biPlanes = 1;
  30. bih.biSize = sizeof(BITMAPINFOHEADER);
  31. bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
  32. bih.biWidth = bmp.bmWidth;//宽度

  33. BITMAPFILEHEADER bfh = { 0 };//位图文件头
  34. bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
  35. bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
  36. bfh.bfType = (WORD)0x4d42;

  37. DWORD dwBmpSize = ((bmp.bmWidth * bmp.bmBitsPixel + 31) / 32) * 4 * bmp.bmHeight;
  38. char* allData = new char[dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
  39. ZeroMemory(allData, dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
  40. memcpy(allData, (void*)&bfh, sizeof(BITMAPFILEHEADER));//写入位图文件头
  41. memcpy(allData + sizeof(BITMAPFILEHEADER), (void*)&bih, sizeof(BITMAPINFOHEADER));//写入位图信息头
  42. byte* p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据
  43. GetDIBits(memDC, (HBITMAP)memBitmap, 0, height, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);//获取位图数据
  44. memcpy(allData + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER), p, dwBmpSize);

  45. //FILE* fp;
  46. //fopen_s(&fp, "H:\\1.bmp", "w+b");//图片保存路径和方式
  47. //fwrite(allData, 1, dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER), fp);
  48. //fclose(fp);

  49. delete[] p;
  50. delete[] allData;
  51. DeleteObject(memBitmap);
  52. DeleteDC(memDC);
  53. ReleaseDC(hwnd, pDC);
  54. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
vs2010基于MFC位图打开显示保存
相同大小bmp文件合并拼接
vc++实现avi文件的操作
C++写BMP位图,主流USB视频摄像头的媒体格式为RGB24和I420,如何把这些数据变成BMP位图存下来呢
avi文件格式详解(三)
用C语言写BMP图像文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服