Knowledge Base Nr: 00241 screenshot.cpp - http://www.swe-kaiser.de

Win32: Screenshots mit Programm erstellen

  
//nur ausschnitt des desktops
int Screenshot(HDC hDC, int nStartX, int nStartY, int nSizeX, int nSizeY);

//ganzer desktop oder nur ein komplettes fenster
int Screenshot(HWND hWnd = HWND_DESKTOP);

//////////////////////////////////////
// implementierung

int CImageSupport::Screenshot(HDC hDC, int nStartX, int nStartY, int nSizeX, int nSizeY)
{
if (!hDC || (nStartX < 0) || (nStartY < 0)
|| (nSizeX <= 0) || (nSizeY <= 0))
return IS_NODATA;

if (m_pRGB)
{
GlobalFree(m_pRGB);
m_pRGB = 0;
m_nWidth = m_nHeight = m_nBits = 0;
}

m_pRGB = ISDCToRGB(hDC, nStartX, nStartY, nSizeX, nSizeY);
if (m_pRGB)
{
m_nWidth = nSizeX;
m_nHeight = nSizeY;
m_nBits = 24;
}

return m_pRGB ? IS_OK : IS_LIBERROR;
}

int CImageSupport::Screenshot(HWND hWnd)
{
if (m_pRGB)
{
GlobalFree(m_pRGB);
m_pRGB = 0;
m_nWidth = m_nHeight = m_nBits = 0;
}

HWND hWndDesktop = HWND_DESKTOP;
HDC hDC = ::GetDC(hWndDesktop);

int nStartX, nStartY, nSizeX, nSizeY;

if (hWnd != HWND_DESKTOP)
{
RECT rect;
::GetWindowRect(hWnd, &rect);
nStartX = rect.left;
nStartY = rect.top;
nSizeX = rect.right - rect.left;
nSizeY = rect.bottom - rect.top;
}
else
{
nStartX = 0;
nStartY = 0;
nSizeX = ::GetSystemMetrics(SM_CXSCREEN);
nSizeY = ::GetSystemMetrics(SM_CYSCREEN);
}

int nErr = Screenshot(hDC, nStartX, nStartY, nSizeX, nSizeY);

if (hWndDesktop && hDC)
::ReleaseDC(hWndDesktop, hDC);

return nErr;
}


///////////////////////////////////////////////////
// beispiel

#include "../cpp_classes/ImgSupport.h"

void CCursortestDlg::OnScreenshot()
{
CImageSupport img;

HWND hWnd = GetSafeHwnd();

int nErr = img.Screenshot(hWnd);
ASSERT(!nErr);

nErr = img.SavePNG("c:/temp/screenshot_app.png");
ASSERT(!nErr);
}

void CCursortestDlg::OnScreenshot2()
{
CImageSupport img;

int nErr = img.Screenshot();
ASSERT(!nErr);

nErr = img.SavePNG("c:/temp/screenshot_desktop.png");
ASSERT(!nErr);
}