[WinAPI] GetDesktopWindow 사용하여 바탕화면 캡쳐하기

오늘은 바탕화면 전체를 캡쳐하는 방법에 대해 설명하겠습니다.
HDC를 한번도 사용해본적이 없다면 여기를 한번 봐주시면 감사하겠습니다.

바탕화면을 핸들을 얻기 위한 함수는 GetDesktopWindow입니다.

HWND GetDesktopWindow();

프로젝트를 생성 하신 후 아래와 같이 스태틱과 버튼 컨트롤을 배치합니다.

스태틱 컨트롤 변수를 헤더파일에 아래와 같이 선언합니다.

CStatic m_stDraw;

확인 버튼을 더블 클릭하여서 GetDesktopWindow 함수를 사용하여 핸들을 얻습니다.

HWND hwndDesktop = ::GetDesktopWindow();	// 바탕화면 핸들 얻기
RECT rectDesk;
::GetWindowRect( hwndDesktop, &rectDesk );	// 바탕화면 크기 

핸들을 얻고 크기를 얻은 다음 바탕 화면의 HDC를 만들어 줍니다.

HWND hwndDesktop = ::GetDesktopWindow();	// 바탕화면 핸들 얻기
RECT rectDesk;
::GetWindowRect( hwndDesktop, &rectDesk );	// 바탕화면 크기 얻기

HDC hdcDesk = ::GetDC( hwndDesktop );	// 바탕화면 DC 얻기

바탕화면에 대한 비트맵 정보를 얻었으면 이제 스태틱 컨트롤의 DC와 크기도 얻습니다.

RECT rectDraw;
::GetWindowRect( m_stDraw.m_hWnd, &rectDraw ); 	// 스태틱 컨트롤 크기 얻기

HDC hdcDraw = ::GetDC( m_stDraw.m_hWnd );	// 스태틱 컨트롤 DC 얻기

바탕 화면의 그림을 스태틱 컨트롤에 그려줍니다.

::SetStretchBltMode( hdcDraw, HALFTONE );

::StretchBlt( hdcDraw, 0, 0, rectDraw.right - rectDraw.left, rectDraw.bottom - rectDraw.top,
	hdcDesk, 0, 0, rectDesk.right - rectDesk.left, rectDesk.bottom - rectDesk.top, SRCCOPY );

실행 시켜보면 아래와 같이 작동합니다.

전체 코드는 아래와 같습니다.

void CMFCApplication1Dlg::OnBnClickedOk()
{
	HWND hwndDesktop = ::GetDesktopWindow();	// 바탕화면 핸들 얻기
	RECT rectDesk;
	::GetWindowRect( hwndDesktop, &rectDesk );	// 바탕화면 크기 얻기

	HDC hdcDesk = ::GetDC( hwndDesktop );	// 바탕화면 DC 얻기
	
	RECT rectDraw;
	::GetWindowRect( m_stDraw.m_hWnd, &rectDraw ); 	// 스태틱 컨트롤 크기 얻기

	HDC hdcDraw = ::GetDC( m_stDraw.m_hWnd );	// 스태틱 컨트롤 DC 얻기

	::SetStretchBltMode( hdcDraw, HALFTONE );

	::StretchBlt( hdcDraw, 0, 0, rectDraw.right - rectDraw.left, rectDraw.bottom - rectDraw.top,
		hdcDesk, 0, 0, rectDesk.right - rectDesk.left, rectDesk.bottom - rectDesk.top, SRCCOPY );
}