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;
}