分享

MFC,C++实现后台截屏

 行走在理想边缘 2024-02-20 发布于四川

在两篇文章基础上有修改,建立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. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多