www.pudn.com > WmformatScreen.rar > CScreenGrabber.cpp


// 
// CScreenGrabber.cpp 
// 
/** 
 ** Copyright (C) 2005 EnjoyView Inc., all rights reserved. 
 **           Your View, Our Passion. Just Enjoy It! 
 ** 
 **            http://spaces.msn.com/members/jemylu 
 ** 
 **/ 
 
/*************************************************************************/ 
 
#include "stdafx.h" 
#include "CScreenGrabber.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
////////////////////////////////////////////////////////////////////////////// 
CScreenGrabber::CScreenGrabber() 
{ 
	mScreenWidth  = 0; 
	mScreenHeight = 0; 
	mBitDepth     = 0; 
	mInited       = FALSE; 
	mScreenDC     = NULL; 
	mMemDC        = NULL; 
	mMemBmp       = NULL; 
	mOldBmp       = NULL; 
 
	memset(&mHeader, 0, sizeof(mHeader)); 
	mHeader.biSize     = sizeof(BITMAPINFOHEADER); 
	mHeader.biPlanes   = 1; 
	mHeader.biBitCount = 1; 
	mHeader.biCompression = BI_RGB; 
	 
	Init(); 
} 
 
CScreenGrabber::~CScreenGrabber() 
{ 
	Uninit(); 
} 
 
BOOL CScreenGrabber::Init(void) 
{ 
	if (mInited) 
	{ 
		return TRUE; 
	} 
 
	mScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);  
	mInited = (mScreenDC != NULL); 
	if (mInited) 
	{ 
		mMemDC    = CreateCompatibleDC(mScreenDC); 
		// Create a compatible bitmap for hdcScreen.  
		mScreenWidth  = GetDeviceCaps(mScreenDC, HORZRES); 
		mScreenHeight = GetDeviceCaps(mScreenDC, VERTRES); 
		mBitDepth     = GetDeviceCaps(mScreenDC, BITSPIXEL); 
		mHeader.biBitCount = WORD(mBitDepth); 
		mHeader.biWidth    = mScreenWidth; 
		mHeader.biHeight   = mScreenHeight; 
		mMemBmp = CreateCompatibleBitmap(mScreenDC, mScreenWidth, mScreenHeight); 
		mInited = (mMemBmp != NULL); 
	} 
	if (mInited) 
	{ 
		mOldBmp = (HBITMAP) SelectObject(mMemDC, mMemBmp); 
		mInited = (mOldBmp != NULL); 
	} 
 
	if (!mInited) 
	{ 
		Uninit(); 
	} 
	return mInited; 
} 
 
void CScreenGrabber::Uninit(void) 
{ 
	if (mOldBmp && mMemBmp && mMemDC) 
	{ 
		SelectObject(mMemDC, mOldBmp); 
		DeleteObject(mMemBmp); 
		mMemBmp = NULL; 
		mOldBmp = NULL; 
	} 
	if (mMemDC) 
	{ 
		DeleteDC(mMemDC); 
		mMemDC = NULL; 
	} 
	if (mScreenDC) 
	{ 
		DeleteDC(mScreenDC); 
		mScreenDC = NULL; 
	} 
	mInited = FALSE; 
} 
 
long CScreenGrabber::GetImageWidth(void) 
{ 
	return mScreenWidth; 
} 
 
long CScreenGrabber::GetImageHeight(void) 
{ 
	return mScreenHeight; 
} 
 
long CScreenGrabber::GetBitDepth(void) 
{ 
	return mBitDepth; 
} 
 
long CScreenGrabber::GetImageSize(void) 
{ 
	return (mScreenWidth * mScreenHeight * mBitDepth / 8); 
} 
 
BOOL CScreenGrabber::CaptureAFrame(BYTE * outBuffer, unsigned long * outLength) 
{ 
	if (mInited) 
	{ 
#ifdef _DEBUG 
		DWORD dw1 = timeGetTime(); 
#endif // _DEBUG 
 
		BitBlt(mMemDC,0,0,mScreenWidth,mScreenHeight,mScreenDC,0,0,SRCCOPY); 
		LONG lLines = GetDIBits(mMemDC, mMemBmp, 0, mScreenHeight, (PVOID)outBuffer,  
			(BITMAPINFO *)&mHeader, DIB_RGB_COLORS); 
		*outLength = mScreenWidth * mScreenHeight * mBitDepth / 8; 
 
#ifdef _DEBUG 
		DWORD dw2 = timeGetTime(); 
		DWORD delta = dw2 - dw1; 
#endif // _DEBUG 
 
		return TRUE; 
	} 
	return FALSE; 
}