NAlek
![]() |
Пример получения снимка экрана используя библиотеку 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): ![]() ![]() |