NAlek
int main() { return 0; }
« Получение снимка экрана

Пример получения снимка экрана используя библиотеку GDI+.



NScreenshot.cpp
#include "NScreenshot.h"


// конструктор
CNScreenshot::CNScreenshot()
{
	// инициализируем библиотеку gdi+
	GdiplusStartup(&gdipToken, &gdipStartupInput, NULL);
}

// деструктор
CNScreenshot::~CNScreenshot()
{
	// выгружаем библиатеку gdi+
	GdiplusShutdown(gdipToken);
}

// выбираем кодек
int CNScreenshot::GetEncoderClsid( const WCHAR *wcMimeType, CLSID* pClsid )
{
	// количество доступных енкодеров
	UINT num = 0;
	// размкер массива ImageCodecInfo
	UINT size = 0;

	// указатель на массив енкодеров	
	ImageCodecInfo* pImageCodecInfo = NULL;

	// определим мразмер массива енкодеров
	GetImageEncodersSize(&num, &size);
	if(size == 0)
		return -1;  // Failure

	// выделяем память под массив
	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if(pImageCodecInfo == NULL)
		return -1;  // Failure

	// получем информацию об енкодерах
	GetImageEncoders(num, size, pImageCodecInfo);

	for( UINT i = 0; i < num; ++i )
	{
		if( wcscmp(pImageCodecInfo[i].MimeType, wcMimeType) == 0 )
		{
			*pClsid = pImageCodecInfo[i].Clsid;
			free(pImageCodecInfo);
			return i;  // Success
		}    
	}

	free(pImageCodecInfo);
	return 0;

}


// делаем снимок экрана
BOOLEAN CNScreenshot::TakeScreenshot( LPVOID *pJpegBuffer, PSIZE_T pJpegSize, ULONG ulQuality, const WCHAR *wcMimeType )
{
	BOOLEAN bRet =TRUE;

	HDC hDesktopDC, hMemDC;
	HBITMAP hMemBitmap;
	// получем HDC рабочего стола
	hDesktopDC = ::GetDC(NULL);

	UINT uiHeight = GetDeviceCaps( hDesktopDC, VERTRES ); //GetSystemMetrics( SM_CYSCREEN );
	UINT uiWidth = GetDeviceCaps( hDesktopDC, HORZRES ); //GetSystemMetrics( SM_CXSCREEN );
	hMemDC = CreateCompatibleDC( hDesktopDC );
	hMemBitmap = CreateCompatibleBitmap( hDesktopDC, uiWidth, uiHeight);
	HBITMAP hOldBitmap =(HBITMAP)SelectObject( hMemDC, hMemBitmap );
	BitBlt( hMemDC, 0, 0, uiWidth, uiHeight, hDesktopDC, 0, 0, SRCCOPY );

	Gdiplus::Bitmap bitmap( hMemBitmap, NULL );

	CLSID encoderClsid;
	EncoderParameters encoderParam;

	// определим параметры кодирования
	// качество кодирования от 0 до 100
	encoderParam.Count = 1;
	encoderParam.Parameter[0].Guid = EncoderQuality;
	encoderParam.Parameter[0].Type = EncoderParameterValueTypeLong;
	encoderParam.Parameter[0].NumberOfValues = 1;
	//
	encoderParam.Parameter[0].Value = &ulQuality;

	// получим clsid енкодера
	GetEncoderClsid( wcMimeType, &encoderClsid );


	IStream * pStream;
	if( SUCCEEDED( CreateStreamOnHGlobal(0,TRUE,&pStream ) ) ) // creating stream
	{
		//status = SrcBitmap.Save(pStream,&jpgClsid,0); // saving image to the stream
		if( ( bitmap.Save( pStream, &encoderClsid, &encoderParam ) ) ==Gdiplus::Ok )
		{
			LARGE_INTEGER lOfs;
			ULARGE_INTEGER lSize;
			
			lOfs.QuadPart = 0;
			if( SUCCEEDED( pStream->Seek( lOfs, STREAM_SEEK_END, &lSize ) ) ) // retrieving size of stream data (seek to end)
			{
				lOfs.QuadPart = 0;
				if( SUCCEEDED( pStream->Seek( lOfs, STREAM_SEEK_SET, 0 ) ) ) // seeking to beginning of the stream data
				{
					*pJpegSize = (ULONG)((DWORD_PTR)lSize.QuadPart);
					*pJpegBuffer = malloc( *pJpegSize ); // allocating userbuffer
					if( *pJpegBuffer )
					{
						if( SUCCEEDED( pStream->Read( *pJpegBuffer, (ULONG)*pJpegSize, 0 ) ) ) // reading stream to buffer
						{
							bRet =TRUE;
						}
					}
				}
			}
		}

		pStream->Release(); // releasing stream
	}

	SelectObject( hMemDC, hOldBitmap );
	DeleteObject( hMemDC );
	DeleteObject( hMemBitmap );
	::ReleaseDC( 0, hDesktopDC );

	return bRet;
}

NScreenshot.h
//
// класс для работы со снимками экрана
//
#pragma once

// подключаем библиатеку gdi+
#include <gdiplus.h>

using namespace Gdiplus;

// описание класса
class CNScreenshot
{
private:
	GdiplusStartupInput gdipStartupInput;
	ULONG_PTR gdipToken;

	// выбираем кодек
	int GetEncoderClsid( const WCHAR *wcMimeType, CLSID* pClsid );


public:
	// конструктор
	CNScreenshot();
	// деструктор
	~CNScreenshot();

	// делаем снимок экрана
	BOOLEAN TakeScreenshot( LPVOID *pJpegBuffer, PSIZE_T pJpegSize, ULONG ulQuality, const WCHAR *wcMimeType );
};

Пример (MS Visual Studio 2010): Демонстрация | Исходный код
Яндекс.Метрика