使用BitBlt的Win32窗口捕获不显示边框 [英] Win32 window capture with BitBlt not displaying border

查看:120
本文介绍了使用BitBlt的Win32窗口捕获不显示边框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经编写了一些c ++代码来捕获.bmp文件的窗口.

I have written some c++ code to capture a window to a .bmp file.

BITMAPFILEHEADER get_bitmap_file_header(int width, int height)
{
 BITMAPFILEHEADER hdr;
 memset(&hdr, 0, sizeof(BITMAPFILEHEADER));
 hdr.bfType  = ((WORD) ('M' << 8) | 'B'); // is always "BM"
 hdr.bfSize  = 0;//sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (width * height * sizeof(int));
 hdr.bfReserved1 = 0;
 hdr.bfReserved2 = 0;
 hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));

 return hdr;
}

BITMAPINFO get_bitmap_info(int width, int height)
{
 BITMAPINFO bmi;
 memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER));
 //initialize bitmap header
 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 bmi.bmiHeader.biWidth = width;
 bmi.bmiHeader.biHeight = height;
 bmi.bmiHeader.biPlanes = 1;
 bmi.bmiHeader.biBitCount = 4 * 8;
 bmi.bmiHeader.biCompression = BI_RGB;
 bmi.bmiHeader.biSizeImage = width * height * 4;

 return bmi;
}

void get_bitmap_from_window(HWND hWnd, int * imageBuff)
{
 HDC hDC = GetWindowDC(hWnd);
 SIZE size = get_window_size(hWnd);
 HDC hMemDC = CreateCompatibleDC(hDC);
 RECT r;

 HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy);
 HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBitmap);

 BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY);
    //PrintWindow(hWnd, hMemDC, 0);

 BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy);
 GetDIBits(hMemDC, hBitmap, 0, size.cy, imageBuff, &bmi, DIB_RGB_COLORS);

 SelectObject(hMemDC, hOld);
    DeleteDC(hMemDC);
    ReleaseDC(NULL, hDC);
}

void save_image(HWND hWnd, char * name)
{
 int * buff;
 RECT r;
 SIZE size;

 GetWindowRect(hWnd, &r);
 size.cx = r.right-r.left;
 size.cy = r.bottom-r.top;

 buff = (int*)malloc(size.cx * size.cy * sizeof(int));

 get_bitmap_from_window(hWnd, buff);

 BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy);
 BITMAPFILEHEADER hdr = get_bitmap_file_header(size.cx, size.cy);

 FILE * fout = fopen(name, "w");
 fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), fout);
 fwrite(&bmi.bmiHeader, 1, sizeof(BITMAPINFOHEADER), fout);
 fwrite(buff, 1, size.cx * size.cy * sizeof(int), fout);

 fflush(fout);
 fclose(fout);
 free(buff);
}

它可以在XP下找到,但是在Vista下,窗口的边框是透明的.

It works find under XP, but under Vista the border of the window is transparent.

使用PrintWindow解决了此问题,但出于性能原因是不可接受的.

Using PrintWindow solves the problem, but is unacceptable for performance reasons.

是否进行了有效的代码更改或可以更改设置以使边框不透明?

Is there a performant code change, or a setting that can be changed to make the border non-transparent?

推荐答案

在下面使用

BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY | CAPTUREBLT);

这篇关于使用BitBlt的Win32窗口捕获不显示边框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆