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

函数说明:
        为保证图像质量,用 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;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值