现在的位置: 首页 > 综合 > 正文

自己写远程控制软件之捕捉屏幕

2013年08月12日 ⁄ 综合 ⁄ 共 1842字 ⁄ 字号 评论关闭

函数说明:
        为保证图像质量,用 24 位位图,后面再说如何压缩成 JPG

函数如下:
void CaptureScreen(PCHAR lpBuffer, DWORD dwLength, DWORD dwWidth, DWORD dwHeight, DWORD &dwBitmapSize);

lpBuffer 存储以下信息:
BITMAPFILEHEADER
BITMAPINFOHEADER
RGB 数据


void CaptureScreen(PCHAR lpBuffer, DWORD dwLength, DWORD dwWidth, DWORD dwHeight, DWORD &dwBitmapSize)
{
	dwBitmapSize = 0;

	HWND hDesktopWnd= ::GetDesktopWindow();
	HDC hDesktopDC	= ::GetDC(hDesktopWnd);
	HDC hCaptureDC	= ::CreateCompatibleDC(hDesktopDC);
	HBITMAP hBitmap = ::CreateCompatibleBitmap(hDesktopDC, dwWidth, dwHeight);
	LPBITMAPFILEHEADER pFileHeader= (LPBITMAPFILEHEADER) lpBuffer;
	LPBITMAPINFO pBitmapInfo = (LPBITMAPINFO) (lpBuffer + sizeof(BITMAPFILEHEADER));

	::SelectObject(hCaptureDC, hBitmap);
	::BitBlt(hCaptureDC, 0, 0, dwWidth, dwHeight, hDesktopDC, 0, 0, SRCCOPY);

	BITMAP bmpBit = { 0 };
	::GetObject(hBitmap, sizeof(BITMAP), &bmpBit);

	pBitmapInfo->bmiHeader.biSize		= sizeof(BITMAPINFOHEADER);
	pBitmapInfo->bmiHeader.biWidth		= bmpBit.bmWidth;
	pBitmapInfo->bmiHeader.biHeight		= bmpBit.bmHeight;
	pBitmapInfo->bmiHeader.biPlanes		= 1;
	pBitmapInfo->bmiHeader.biBitCount	= 24;
	pBitmapInfo->bmiHeader.biCompression	= 0;
	pBitmapInfo->bmiHeader.biSizeImage	= bmpBit.bmWidthBytes * bmpBit.bmHeight;
	pBitmapInfo->bmiHeader.biXPelsPerMeter= 0;
	pBitmapInfo->bmiHeader.biYPelsPerMeter= 0;
	pBitmapInfo->bmiHeader.biClrUsed	= 0;
	pBitmapInfo->bmiHeader.biClrImportant	= 0;

	pFileHeader->bfType	= 0x4D42;
	pFileHeader->bfOffBits	= sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
	pFileHeader->bfSize	= pBitmapInfo->bmiHeader.biSizeImage + pFileHeader->bfOffBits;
	pFileHeader->bfReserved1= 0;
	pFileHeader->bfReserved2= 0;

	PCHAR pBmpData = lpBuffer + sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
	::GetDIBits(hCaptureDC, hBitmap, 0, bmpBit.bmHeight, pBmpData, pBitmapInfo, DIB_RGB_COLORS);

	::ReleaseDC(hDesktopWnd, hDesktopDC);
	::DeleteDC(hCaptureDC);
	::DeleteObject(hBitmap);

	dwBitmapSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + pBitmapInfo->bmiHeader.biSizeImage;
}

抱歉!评论已关闭.