It's just a demo to show GDI+ usage, just for fun
#ifndef UNICODE
#define UINICODE
#endif
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <iostream>
//using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
int GetEncoderClsid(const WCHAR* format, CLSID* pCLSID);
CLSID GetEncoderClsid(const WCHAR* format)
{
UINT num, size;
Gdiplus::ImageCodecInfo* pImageCodecInfo;
Gdiplus::GetImageEncodersSize(&num,&size);
pImageCodecInfo=(Gdiplus::ImageCodecInfo*)(malloc(size));
GetImageEncoders(num,size,pImageCodecInfo);
for(UINT i=0; i<num; ++i)
{
if(!wcscmp(pImageCodecInfo[i].MimeType,format))
{
CLSID id = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return id;
}
}
std::wcout << format << " is not availbale on this computer" << std::endl;
exit(-1);
}
void captureScreen(TCHAR const* wndName, TCHAR const* saveFile)
{
static CLSID pngClsid =GetEncoderClsid(L"image/png");
HWND hwnd = ::FindWindow(NULL, wndName);
BOOL foundWnd = TRUE;
int cx = 1024, cy = 768;
if(!hwnd)
{
foundWnd = FALSE;
hwnd = GetDesktopWindow();
std::wcout << L"failed to find window \"" << wndName << L"\""<< std::endl;
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
}
else
{
HDC hdc = ::GetWindowDC(hwnd);
RECT rc = {0};
if(::GetWindowRect(hwnd, &rc))
{
cx = rc.right - rc.left;
cy = rc.bottom - rc.top;
}
}
HDC hWndDC = GetDC(hwnd);
HDC hMemDC = CreateCompatibleDC(hWndDC);
HBITMAP hMemBitmap =CreateCompatibleBitmap(hWndDC,cx,cy);
HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC,hMemBitmap);
//capturing
//for founded windows, use PrintWindow to avoid only client rect captured
if(!foundWnd)
BitBlt(hMemDC,0,0,cx,cy,hWndDC,0,0,SRCCOPY);
else
::PrintWindow(hwnd, hMemDC,0);
Gdiplus::Bitmap bmp(hMemBitmap,NULL);
//restore
::SelectObject(hMemDC, hOldBmp);
//save to disk
bmp.Save(saveFile,&pngClsid);
//release gdi objects
ReleaseDC(hwnd,hWndDC);
DeleteDC(hMemDC);
DeleteObject(hMemBitmap);
}
int wmain(int argc, TCHAR* args[])
{
if(argc < 3)
{
std::wcout << L"usage: " << args[0] <<L" window_name saveFile" << std::endl;
return 0;
}
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
captureScreen(args[1] ,args[2]);
Gdiplus::GdiplusShutdown(gdiplusToken);
return 0;
}