windows桌面抓图

介绍一个使用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);
}
 

你可能感兴趣的:(windows,null,BI,colors)