介绍一个使用GetDIBits截图的方法,如下:
//rgb数据
unsigned char *g_sRGBdata = NULL;
//rgb数据大小
int g_nRGBData;
HWND hDesktopWnd;
HDC hDesktopDC;
HDC hCaptureDC;
HBITMAP hCaptureBitmap;
BITMAPINFO bi= {0};
...
// create buf,dc
g_nRGBData = g_nWidth*g_nHeight*4;
g_sRGBdata = (unsigned char *)malloc(g_nRGBData);
hDesktopWnd = ::GetDesktopWindow(); //窗口句柄
hDesktopDC = ::GetDC(hDesktopWnd); //窗口DC句柄
hCaptureDC = ::CreateCompatibleDC(hDesktopDC); //兼容DC句柄
hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC,
g_nWidth, g_nHeight); //兼容位图句柄,宽高可自设
SelectObject(hCaptureDC, hCaptureBitmap);
//获取桌面位图的信息
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int iRst = GetDIBits( hCaptureDC, hCaptureBitmap, 0, 0,
NULL, &bi, DIB_RGB_COLORS); // 获取位图信息到bi,也可直接赋值
//开始抓图
while(!g_bExit)
{
memset(g_sRGBdata,0,g_nRGBData); //sRGB_data用来保存RGB数据
bi.bmiHeader.biHeight = g_nHeight;
BOOL bRet = BitBlt( hCaptureDC,0,0,bi.bmiHeader.biWidth,
bi.bmiHeader.biHeight, hDesktopDC, 0, 0, SRCCOPY|CAPTUREBLT); //复制位图
bi.bmiHeader.biHeight = -g_nHeight; // 没有录像会是倒的。
int iRet = GetDIBits( hCaptureDC, hCaptureBitmap, 0, g_nHeight,
g_sRGBdata,&bi, DIB_RGB_COLORS); //抓到的数据就存在g_sRGBdata
...//处理数据。
Sleep(40);
}